为什么DB的设计中要使用Long来替换掉Date类型?

java小课堂

李林朋

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

在对数据库中的记录进行操作的时候,需要牵涉到对时间数据的处理,如create_at,update_at等字段,数据库中有专门用于存储时间的类型,date,还可以将类型设置为long类型,那么两者的有何差异?

2.知识剖析

MySQL中的date类型

date:日期,占用三个字节,1000-01-01——9999-12-31

datetime:日期+时间,1000-01-01 00:00:00” 到“9999-12-31 23:59:59,占用8个字节,datetime类型适合用来记录数据的原始的创建时间,因为无论你怎么更改记录中其他字段的值,datetime字段的值都不会改变,除非你手动更改它。

timestamp:日期+时间,占用4个字节,“19700101080001——20380119111407,timestamp类型适合用来记录数据的最后修改时间,因为只要你更改了记录中其他字段的值,timestamp字段的值都会被自动更新。

MySQL中的bigint类型

bignit,表示从-2^63到2^63-1(即从-9,223,372,036,854,775,808到 9,223,372,036,854,775,807)之间的整数,它占用了八个字节的存储空间。

java中的long类型

基本数据类型,8个字节

3.常见问题

3.java中对时间处理的类比较混乱:java.util.Date, java.sql.Date , java.sql.Time , java.sql.Timestamp, java.util.Calendar , java.util.TimeZone

2.时区

3.精度,将java.util.Date转为java.sql.Date时候,日期的时分秒会被去掉,数据的精度发生变化了。这是两个上下级类之间很不合理的问题。 而JDBC中定义接口时候,用的是java.sql.Date,而我们常常用到的Date都是java.util.Date,这往往导致一些转换过程中发生误差。

java.sql.Timestamp类,它保持了日期数据原有的精度。可以实现和java.util.Date的无损转换。但是Timestamp这个类在一些预定义SQL中常常会出问题,

java.sql.Date,在JDBC接口中使用了,如果对其进行修改,JDBC接口规范也要改,那么将引发各个数据库厂商对数据库驱动也要改,这是不可接受的。[1]

4.解决方案

将date类型转换为long类型

1.有利于计算时间差

2.方便java与数据库之间的传输

unix时间戳,unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数[2]

5.编码实战

mysql中获取时间

java中获取时间

转换

6.扩展思考

7.参考文献

8.更多讨论

[1] http://lavasoft.blog.51cto.com/62575/224196/

[2] https://baike.baidu.com/item/unix时间戳/2078227?fr=aladdin

感谢观看

BY : 李林朋