MySQL学习-数据类型-日期与时间类型

192 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

前言

上篇我们学习了MySQL中的数据类型中的浮点数,定点数与位类型。有兴趣的小伙伴可以阅读(# MySQL学习-数据类型-浮点,定点数,位类型)。
下面学习MySQL中的数据类型中的日期与时间类型。

日期与时间类型

MySQL有多种表示日期和时间的类型,不同版本有所差异,MySQL8.0版本支持的日期和时间类型主要有:YEAR,TIME,DATE,DATETIME和TIMESTAMP类型。

  • YEAR:表示年。
  • TIME:表示时,分,秒。
  • DATE:表示年,月,日。
  • DATETIME:表示年,月,日,时,分,秒。
  • TIMESTAMP:表示带时区的年,月,日,时,分,秒。
类型名称字节日期格式最小值最大值
YEAR1YYYY或YY19012155
TIME时间3HH:MM:SS-838:59:59838:59:59
DATE日期3YYYY-MM-DD1000-01-019999-12-03
DATETIME日期时间8YYYY-MM-DD HH:MM:SS1000-01-01 00:00:009999-12-03 23:59:59
TIMESTAMP日期时间4YYYY-MM-DD HH:MM:SS1970-01-01 00:00:00 UTC2038-01-19 03:14:07 UTC

TIME类型的范围是-838:59:59 ~ 838:59:59,这里为什么不是-23:59:59 ~ 23:59:59呢?原因是MySQL设计的TIME类型,不光可以表示一天之内的时间,而且可以用来表示一个时间间隔,这个时间间隔可以超过24小时。

YEAR类型

YEAR类型表示年。YEAR可以以4位字符串或数字格式存储,也可以用2位字符串格式存储。从MySQL5.5.27开始,2位格式的YEAR已经不推荐使用。YEAR的默认格式是“YYYY”。

超出范围存储数据的话,MySQL会报错。

TIME类型

TIME类型表示时间,不包含日期。

插入数据时,可用3种方式:

  1. 可以使用带冒号的字符串,比如“D HH:MM:SS”、“HH:MM:SS”、“HH:MM”、“D HH:MM”、“D HH”或“SS”格式。其中D表示天,最小值是0,最大值是34。如果使用带有D格式的字符串插入数据时,D会被转化为小时,计算格式为D*24+HH。当使用带有冒号并且不带D的字符串时,表示当天的时间。
  2. 可以使用不带冒号的字符串或数字,格式为“HHMMSS”或HHMMSS。如果插入一个不合法的字符串或数字,MySQL在存储数据时,会将其自动转化为00:00:00进行存储。比如1210,MySQL会将最右边的两位解析成秒,表示00:12:10,而不是12:10:00。
  3. 使用CURRENT_TIME()或者NOW(),会插入当前系统的时间。

DATE类型

DATE类型表示日期,没有时间。

插入数据时,可以3种方式:

  1. 使用YYYY-MM-DD或者YYYYMMDD表示字符串日期,其最小取值为1000-01-01,最大值为9999-12-03。其中YYYYMMDD格式会被转化为YYYY-MM-DD格式。
  2. 使用YY-MM-DD或YYMMDD格式表示的字符串日期,此格式中,年份为两位数值或字符串。当年份取值为00到69时,会被转化为2000到2069,当年份取值为70到99时,会被转化为1970到1999。当使用的是数字时,运行存在隐式转换。
  3. 使用CURRENT_DATE()或者NOW()函数,插入当前系统的日期。

DATETIME类型

DATETIME类型表示日期时间。

插入数据时,可以使用3种方式:

  1. 使用YYYY-MM-DD HH:MM:SS或者YYYYMMDDHHMMSS格式插入时间,最小值为1000-01-01 00:00:00,最大值为9999-12-03 23:59:59。当以YYYYMMDDHHMMSS格式的数字插入时,会被转化为YYYY-MM-DD HH:MM:SS格式。
  2. 使用YY-MM-DD HH:MM:SS或者YYMMDDHHMMSS格式插入时,两位数的年份规则否和YEAR类型的规则,当年份取值为00到69时,会被转化为2000到2069,当年份取值为70到99时,会被转化为1970到1999。
  3. 使用函数CURRENT_TIMESTAMP()和NOW(),可以插入当前系统的日期和时间。

TIMESTAMP类型

TIMESTAMP类型也表示日期时间,显示格式与DATETIME相同,都是YYYY-MM-DD HH:MM:SS。但是TIMESTAMP存储的时间范围比DATETIME小很多,只能存储“1970-01-01 00:00:00 UTC”到“2038-01-19 03:14:07 UTC”之间的时间。其中,UTC表示世界统一时间,也叫作世界标准时间。如果插入的时间超过TIMESTAMP类型的范围,则MySQL会报错。

使用TIMESTAMP类型存储数据时,需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。因此,使用TIMESTAMP存储的同一个时间值,在不同的时区查询时会显示不同的时间。

DATETIME类型与TIMESTAMP类型区别

  1. TIMESTAMP存储空间小,表示的日期时间范围也比较小。
  2. 底层存储方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-01-01 00:00:00毫秒的毫秒值。
  3. 两个日期比较大小或日期计算时,TIMESTAMP更方便,更快。
  4. TIMESTAMP与时区有关。TIMESTAMP会根据用户的时区不同,显示不同的结果。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差。

经验

开发中使用最多的是日期时间类型,就是DATETIME。因为这个类型包含了完整的日期和时间信息,取值范围也很大,使用起来比较方便。一般用于计算的不建议使用DATETIME存储,而是使用时间戳,因为DATETIME虽然直观,但是不便于计算。

今天先学习到这里,明天继续。