Mysql时间类型

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型来存储时间,可以存储到毫秒级别,边界值处理也会更细,比较大小和求取差值也更直观。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容