为什么要用Long代替DATE类型?

Java小课堂

分享人:牛涛

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

MYSqL中的DATE类型。

格式的规定:Y表示年、M(前M)表示月、D表示日、H表示小时、M(后M)表示分钟、S表示秒。

下面是MySQL中可用的日期和时间列类型

DATETIME——格式:'YYYY-MM-DD HH:MM:SS',范围:'1000-01-01 00:00:00'到'9999-12-31 23:59:59'

DATE——格式:'YYYY-MM-DD',范围:'1000-01-01'到'9999-12-31'

TIMESTAMP——格式:'YYYYMMDDHHMMSS'、'YYMMDDHHMMSS'、'YYYYMMDD'

范围:'1970-01-01 00:00:00'到'2037-01-01 00:00:00'

2.知识剖析

1、什么是时间戳

时间戳指的就是Unix时间戳(Unix timestamp)。它也被称为Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。因此,严格来说,不管你处在地球上的哪个地方,任意时间点的时间戳都是相同的。这点有利于线上和客户端分布式应用统一追踪时间信息。

2、什么是时区?

时区是地球上的区域使用同一个时间定义。为了照顾到各地区的使用方便,又使其他地方的人容易将本地的时间换算到别的地方时间上去。有关国际会议决定将地球表面按经线从南到北,划分成24个时区,并且规定相邻区域的时间相差1小时。当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。中国把首都北京所在的东8区的时间作为全国统一的时间,称为北京时间。

3.常见问题

明明Date类型就该表示时间,为何要用bigint替代呢?

4.解决方案

Date类型与时区有关。


timestamp与时区无关。


mysql 中的timestamp会自动更新,如果不需要这个功能,则使用bigint记录timestamp。


5.编码实战

6.扩展思考

选择Mysql数据类型有哪些原则?

1.更小的通常是更好的(一般情况下,应该尽可能使用正确存储数据的最小数据类型。

(1) 因为更小的数据类型通常更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更短。

(2) 要确保没有低估需要存储的值的范围,更小是相对与数据类型的最大值范围来讲的。

(3) 如果无法确定哪个数据类型是最好的,就选择你认为不会超过范围的最小类型。

2.简单就好(简单数据类型的操作通常需要更短的CPU周期。

(1)整型比字符串操作代价更低,因为字符串集和校对规则(排序规则)是的字符比较比整型比较更复杂。

(2)能够使用整型表示的字段,就不要用字符串。

3.尽量避免 NULL (空值)

(1)很多表都包含可为NULL的列,就算程序并不需要保存NULL也是如此,这是因为列的默认属性就是可为NULL。通常情况下最好指定列NOT NULL,除非真的需要存储NULL。

(2) 如果查询中包含可为NULL的列,对于Mysql来说是很难优化的,因为NULL的列使得索引,索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在Mysql里也需要特殊处理。

3.总结

(1)第一步需要确定合适的大类型(数字、字符串、时间等等)

(2)根据存储的长度和范围细化类型

(3)特殊情况考虑(eg: TIMESAMP的自动更新功能是否需要?)

7.参考文献

1.龚师兄的小课堂。

2. http://billauer.co.il/blog/2009/03/mysql-datetime-epoch-unix-time/

3.http://www.joda.org/joda-time/quickstart.html

8.更多讨论

今天的分享就到这里啦,欢迎大家提问和探讨!