美文网首页
Mysql时间类型

Mysql时间类型

作者: 紫石南 | 来源:发表于2017-08-11 17:18 被阅读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型来存储时间,可以存储到毫秒级别,边界值处理也会更细,比较大小和求取差值也更直观。

    相关文章

      网友评论

          本文标题:Mysql时间类型

          本文链接:https://www.haomeiwen.com/subject/gckrrxtx.html