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