Mysql时间类型

2017-08-11  本文已影响37人  紫石南

mysql中时间数据类型

mysql提供了DATETIME、DATE、TIMESTAMP、TIME和YEAR五种数据类型来存储时间。他们的范围为:

类型 最小值 最大值
YEAR 1901 2155
TIME -838:59:59 838:59:59
DATE 1000-01-01 9999-12-31
TIMESTAMP 不定 不定
DATETIME 1000-01-01 00:00:00 9999-12-31 23:59:59

TIMESTAMP

之所以TIMESTAMP类型不定是因为它的类型属性不定,取决于MySQL版本和服务器运行的SQL模式。一般存储时间日期都选用DATETIME。

Y2K问题

所谓的Y2K问题,就是如果只用两位数表示年份,系统不知道是具体是哪一年,如72既可以表示1972又可以表示2072。
mysql号称不存在该问题,因为它有默认的处理方式:

00-69范围的年值转换为2000-2069。
70-99范围的年值转换为1970-1999。

23:59:59的坑

我们要存储开始时间和结束时间,一般都是00:00:00到23:59:59,但是处理时要格外小心。如java获取当天结束时间代码片段:

cal.setTime(day);
cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));

比如2017-08-08,获取到为2017-08-08 23:59:59,打印出sql语句看到的也是这个值,但是插入后看到数据库为2017-08-09 00:00:00!问题出在DATETIME的时间范围,我们的时间有毫秒值,所以变成第二天了。将毫秒设为最小值即可:

// mysql支持只能精确到秒
cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));

时间类型存储推荐方式

推荐用long型来存储时间,可以存储到毫秒级别,边界值处理也会更细,比较大小和求取差值也更直观。

上一篇 下一篇

猜你喜欢

热点阅读