数据库日期类型字段设计应该怎么选择

发布时间:2022-08-13 10:06:37 作者:iii
来源:亿速云 阅读:147

本文小编为大家详细介绍“数据库日期类型字段设计应该怎么选择”,内容详细,步骤清晰,细节处理妥当,希望这篇“数据库日期类型字段设计应该怎么选择”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

当设计一个产品,其中很多地方要把日期类型保存到数据库中,如果产品有兼容不同数据库产品的需求,那么,应当怎样设计呢?

当然,首先想到的是,使用数据库的 Date 或 DateTime 类型,可是看看不同数据库这些类型间的区别吧,真让人望而止步。Mysql 数据库:它们分别是 date、datetime、time、timestamp 和 year。

范围:

Oracle 数据库:

Date 类型的内部编码为12

长度:占用7个字节
数据存储的每一位到第七位分别为:世纪,年,月,日,时,分,秒

TIMESTAMP是支持小数秒和时区的日期/时间类型。对秒的精确度更高

TIMESTAMP WITH TIME ZONE 类型是 TIMESTAMP 的子类型,增加了时区支持,占用13字节的存储空间,最后两位用于保存时区信息

INTERVAL 用于表示一段时间或一个时间间隔的方法。在前面有多次提过。INTERVAL有两种类型.

sql server:datetime 和 smalldatetime

如果没有兼容多种数据库这个要求,我会毫不犹豫的使用数据库的 Date 类型。因为如果使用 Java 框架产生代码,对数据库中定义为 Date 类型的字段,甚至能在页面上产生出JS的时间选择框,的确能节省很多开发时间。而兼容不同数据库,就希望产品在由一种数据库,迁移到另外一种数据库时,尽可能小的代价,使用了 Date,看来就很困难了。

有一个疑问,不知道目前流行的ORM对这个处理得是不是好?因为工作不怎么涉及这方面,所以不大了解。

在之前的设计开发中,因为有支持多种数据库这种需求,所以首先否定了日期时间这样的类型。

曾经使用过毫秒数(Java 的 System.currentTimeMillis())这种方式,但是选用这个方式,考虑的不是使用起来是否方便或者数据迁移,而是考虑到下面的原因:

Java 取到的毫秒数是对时间点的一种准确描述。定义如下:java.lang.System.currentTimeMillis(),它返回从 UTC 1970 年 1 月 1 日午夜开始经过的毫秒数。

我们可以看到,这个定义,保证了这个时间值能够被后续设计开发的人员正确和准确的理解,能够为所有的应用正确理解,能够在所有时区上正确反映为正常的时间形式。

当时的产品设计是有海外客户的,所以当时的设计,在数据库里保存的,应该是一个“准确的时间”。例如“20120926080000”实际上并没有严格的表示出时间,因为北京时间2012年9月26日8点和格林威治时间2012年9月26日8点显然是不一样的。

虽然我们都是在一个确切的时区里,例如中国都是使用东八区时间,但是需要考虑的是:

在这种情况下,如果数据库里的时间不准确,会给程序运行带来问题。这种方式最大的缺点在于:

使用这种方式的特点是牺牲一点易用性和可理解性(不易于维护和理解),满足了查询结果的直观性和准确性要求,同时最大限度考虑运行效率。为了解决这个问题,我设计了一个辅助的措施,就是建立一个数据库函数来进行时间转换,把毫秒数的时间转为制定时区和格式的时间串,DBA 在维护时可以使用。测试了 Oracle 和 DB2 上,都可以这样。例如之前的查询的时候为:

SELECT username,user_addtime from userinfo

这个查询显示的是毫秒数,使用内置函数后写成:

SELECT username,date2str(user_addtime) from userinfo

这样返回的就是东八区、预先定义好格式的字符串了。

在之后的设计里,还使用过 YYYYMMDDHHmmSST 格式,其中的“T”指时区,加入时区,带来的影响有:

带来的好处是:

使用这种方式的特点是牺牲一点效率,满足了查询结果的直观性和准确性要求。

读到这里,这篇“数据库日期类型字段设计应该怎么选择”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. MySQL字段设计规范应如何避免使用TEXT/BLOB类型
  2. 时间序列数据库是什么?应该如何选择

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

数据库

上一篇:怎么利用C++实现Mystring类

下一篇:vue3+vite中开发环境与生产环境全局变量配置的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》