MySQL 中常用的日期和时间类型
文章目录
- DATE 类型的使用
- TIME 类型的使用
- DATETIME 类型的使用
- TIMESTAMP 类型的使用
MySQL 有多种表示日期和时间的数据类型(在不同版本中支持的日期与时间类型可能有所差异),其中实际开发中常用的日期和时间类型有
TIME
、
DATE
、
DATETIME
、
TIMESTAMP
四种类型。
常用日期和时间类型及说明:
数据类型 | 说明 |
---|---|
DATE | 用于表示年、月、日 |
TIME | 用于表示时、分、秒 |
DATETIME | 用于表于年、月、日、时、分、秒 |
TIMESTAMP | 用于表示带时区的年、月、日、时、分、秒 |
常用日期和时间类型的存储格式、范围及占用字节:
数据类型 | 存储格式 | 范围 | 占用字节 |
---|---|---|---|
DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 3 |
TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 3 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 8 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC | 4 |
为什么时间类型 TIME 的取值范围不是 -23:59:59 ~ 23:59:59?
原因是 MySQL 设计的 TIME 类型,不仅可以表示一天之内的时间,而且还可以用来表示一个时间间隔,这个时间间隔可以超过 24 小时。
在实际开发中,使用最多的日期和时间类型是 DATETIME
。这是因为 DATETIME
数据类型包括完整的日期和时间信息,取值范围大,使用方便。但是需要注意的是,一般存注册时间、商品发布时间等,不建议使用 DATETIME
存储,而是建议使用时间戳(TIMESTAMP
),因为 DATETIME
虽然直观,但不便于时间的比较与计算。
DATE 类型的使用
DATE
类型的使用,即向 DATE
类型的字段插入数据,可以分为如下几种情况:
DATE
类型的字段支持以'YYYY-MM-DD'
格式或者'YYYYMMDD'
格式的字符串日期的插入,但是字符串的范围需要在1000-01-01
至9999-12-03
之间。如果插入'YYYMMDD'
格式的字符串,那么'YYYMMDD'
会被转化为'YYYY-MM-DD'
格式。DATE
类型的字段支持以'YY-MM-DD'
格式或者'YYMMDD'
格式的字符串日期的插入,即当年份为两位数时,如果年份部分取值为 00 到 69 则会被转化为 2000 到 2069 年;而如果年份部分取值为 70 到 99 则会被转化为 1970 到 1999。- 使用
CURRENT_DATE()
函数或者NOW()
函数会插入当前系统的日期。
TIME 类型的使用
TIME
类型的使用,即向 TIME
类型的字段插入数据,可以分为如下几种情况:
-
TIME
类型的字段支持'D HH:MM:SS'
、'HH:MM:SS'
、'HH:MM'
、'D HH:MM'
、'D HH'
、'SS'
多种格式字符串的插入。其中,D 表示天,其最小值为 0,最大值为 34。如果使用带有 D 格式的字符串插入 TIME 类型的字段时,D 会被转化为小时,计算格式为
D*24+HH
。例如:-- 格式 'D HH:MM' INSERT INTO test_time (time_column) VALUES ('1 06:15'); -- D = 1,HH = 6,转换后的小时数为 1 * 24 + 6 = 30 -- 实际存储的时间为 30:15:00
当使用带有冒号并且不带 D 的字符串表示时间时,表示当天的时间,例如 12:10 表示 12:10:00,而不是 00:12:10。
-
TIME 类型的字段被插入的字符串格式为
'HHMMSS'
时,如果插入一个不合法的字符串或者数字,MySQL 在存储数据时,会将其自动转化为 00:00:00 进行存储。这里所说的 “不合法”,一般指的是不符合时间规范,像小时超过 23、分钟或秒超过 59,或者字符串长度不对等情况。 -
使用
CURRENT_TIME()
函数或者NOW()
函数会插入当前系统的时间。
DATETIME 类型的使用
DATETIME
类型的使用,即向 DATETIME
类型的字段插入数据,可以分为如下几种情况:
- 以
‘YYYY-MM-DD HH:MM:SS’
格式或者‘YYYYMMDDHHMMSS’
格式的字符串插入DATETIME
类型的字段时,最小值为 1000-01-01 00:00:00,最大值为 9999-12-03 23:59:59。以‘YYYYMMDDHHMMSS’
格式的数字插入DATETIME
类型的字段时,会被转化为‘YYYY-MM-DD HH:MM:SS’
格式。 - 以
‘YY-MM-DD HH:MM:SS’
格式或者'YYMMDDHHMMSS'
格式的字符串插入DATETIME
类型的字段时,即当年份为两位数时,如果年份部分取值为 00 到 69 则会被转化为 2000 到 2069 年;而如果年份部分取值 70 到 99 表示 1970 到 1999。 - 使用
CURRENT_TIME()
函数或者NOW()
函数会插入当前系统的日期时间。
TIMESTAMP 类型的使用
TIMESTAMP
与 DATETIME
的使用基本相同。但是需要注意的是,TIMESTAMP
类型存储数据的时候需要对当前时间所在的时区进行转换,查询数据的时候再将时间转换回当前的时区。因此,使用 TIMESTAMP
存储的同一个时间值,在不同的时区查询时会显示不同的时间。
TIMESTAMP
与 DATETIME
有如下区别:
TIMESTAMP
存储空间比较小,表示的日期时间范围也比较小;TIMESTAMP
底层存储的是距离1970-01-01 00:00:00
毫秒的毫秒值,而DATETIME
存储则是日期时间。两个日期比较大小或日期计算时,TIMESTAMP
相较于DATETIME
更方便于时间的比较与计算,并且比较与计算时使用TIMESTAMP
性能相较更高。TIMESTAMP
与时区有关。TIMESTAMP
会根据用户的时区不同,显示不同的结果。而DATETIME
则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差的。