当前位置: 首页 > 后端技术 > Java

面试官:数据库日期类型字段需要兼容不同的数据库,应该怎么选择?

时间:2023-04-02 10:06:47 Java

作者:sp42a\来源:https://zhangxin.blog.csdn.ne...在设计产品的时候,很多地方都需要在数据库中保存日期类型。如果产品需要兼容不同的数据库产品,那么,应该如何设计呢?当然,首先想到的是使用数据库的Date或者DateTime类型,但是看看这些类型在不同数据库中的区别,着实让人望而生畏。MySQL数据库:这些是日期、日期时间、时间、时间戳和年份。date:以“yyyy-mm-dd”格式表示的日期值time:以“hh:mm:ss”格式表示的时间值datetime:以“yyyy-mm-ddhh:mm:ss”格式表示时间戳:the"yyyymmddhhmmss"formatThetimestampvalueofyear:"yyyy"格式的年份值。范围:日期“1000-01-01”到“9999-12-31”3字节时间“-838:59:59”到“838:59:59”3字节日期时间“1000-01-0100:00:00”到“9999-12-3123:59:59”8字节时间戳19700101000000到2037年的某个时间点4字节年份1901到21551字节Oracle数据库:Date类型的内部编码是12长:占用7个字节,每一位到第七位的数据存储分别是:世纪、年、月、日、时、分、秒TIMESTAMP是一种日期/时间类型,支持小数秒和时区。第二个更准确。TIMESTAMPWITHTIMEZONE类型是TIMESTAMP的子类型,增加了时区支持,占用13字节的存储空间。最后两位用于保存时区信息。INTERVAL是用来表示一段时间或时间间隔的方法。之前已经多次提到了。INTERVAL有两种类型。YEARTOMONTH可以存储按年或按月指定的时间段。DATETOSECOND可以存储由日、时、分、秒指定的时间段。SQLServer:datetime和smalldatetimedatetime数据类型占用的存储空间为8个字节,其中前4个字节用于存储1900年1月1日之前或之后的天数。值分为正数和负数。正数表示该日期之后的日期,负数表示该日期之前的日期;最后4个字节用于存储从这一天零点开始指定时间以来经过的毫秒数。smalldatetime数据类型使用4个字节来存储数据。前两个字节存储从基准日期1900年1月1日开始的天数,后两个字节存储从这一天零点开始到指定时间经过的分钟数。smalldatetime数据类型与datetime数据类型类似,但日期时间范围更小,从1900年1月1日到2079年6月6日。该数据类型精度较低,只能精确到分钟。分钟的单位是根据秒数四舍五入的值,即以30秒为界进行四舍五入。如果没有兼容多个数据库的需求,我会毫不犹豫地使用数据库的Date类型。因为如果使用Java框架生成代码,甚至可以为数据库中定义为Date类型的字段在页面生成一个JS时间选择框,确实可以节省大量的开发时间。为了兼容不同的数据库,希望产品从一个数据库迁移到另一个数据库时,成本尽可能小。使用Date似乎非常困难。我有一个问题,我想知道现在流行的ORM是否能很好地处理这个问题?因为工作涉及的不多,所以了解不多。另外,Java系列面试题和答案已经全部整理出来了:https://www.javastack.cn/mst/在之前的设计开发中,因为需要支持多数据库,首先,日期和时间被拒绝。类型。我用过毫秒的方法(Java的System.currentTimeMillis()),但是选择这个方法的原因不是使用方便或者数据迁移,而是以下原因:Java获取的毫秒数是正确的时间点的准确描述。定义为:java.lang.System.currentTimeMillis(),它返回自1970年1月1日午夜UTC以来的毫秒数。我们可以看到,这个定义保证了这个时间值能够被后续的设计开发人员正确准确的理解,能够被所有的应用程序正确理解,能够在所有的时区中正确的体现为一个正常的时间形式。当时的产品设计有海外客户,所以当时的设计应该在“准确的时间”保存在数据库中。例如,“20120926080000”并没有严格表示时间,因为北京时间2012年9月26日8点与格林威治标准时间2012年9月26日8点明显不同。虽然我们都在一个准确的时区,比如中国使用东八区时间,但是需要考虑的是:有些产品是可能有海外客户的机器,时区设置不一定都在东八区。在这种情况下,如果数据库中的时间不准确,就会导致程序运行出现问题。这种方式最大的缺点是不方便分组查询时间,比如按月统计,按季度统计。DBA在维护时无法根据返回的行结果(结果以毫秒为单位)直观地看到简单明了的结果。number)使用这种方法的特点是牺牲了一点易用性和可理解性(不易维护和理解),满足了查询结果的直观性和准确性要求,同时最大限度地提高了运行效率。为了解决这个问题,我设计了一个辅助措施,就是创建一个时间转换的数据库函数,将以毫秒为单位的时间转换成指定时区和格式的时间字符串,供DBA在维护时使用.在Oracle和DB2上测试过,都可以这样。例如,前面的查询是:SELECTusername,user_addtimefromuserinfo这个查询显示的是毫秒数。使用内置函数后,写成:SELECTusername,date2str(user_addtime)fromuserinfo。这样返回东八区和预定义格式的字符串就没有了。在后来的设计中,也使用了YYYYMMDDHHmmSST格式,其中“T”代表时区。添加时区会产生以下影响:日期和时间字段不能再用数值存储,字符串比数字存储和检索效率都低。给应用程序增加额外处理的好处是便于DBA维护。即使他没有看到数据库设计文档,他也能理解和理解数据库中的一条信息。该字段保存到确切的信息。使用这种方式的特点是牺牲一点效率,满足查询结果的直观性和准确性要求。综上所述,字段类型的选择要根据场景的需要来选择,从功能、效率要求、持续开发要求、维护要求等方面综合考虑。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!