持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
前言
上篇我们学习了MySQL中的数据类型中的浮点数,定点数与位类型。有兴趣的小伙伴可以阅读(# MySQL学习-数据类型-浮点,定点数,位类型)。
下面学习MySQL中的数据类型中的日期与时间类型。
日期与时间类型
MySQL有多种表示日期和时间的类型,不同版本有所差异,MySQL8.0版本支持的日期和时间类型主要有:YEAR,TIME,DATE,DATETIME和TIMESTAMP类型。
- YEAR:表示年。
- TIME:表示时,分,秒。
- DATE:表示年,月,日。
- DATETIME:表示年,月,日,时,分,秒。
- TIMESTAMP:表示带时区的年,月,日,时,分,秒。
| 类型 | 名称 | 字节 | 日期格式 | 最小值 | 最大值 |
|---|---|---|---|---|---|
| YEAR | 年 | 1 | YYYY或YY | 1901 | 2155 |
| TIME | 时间 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
| DATE | 日期 | 3 | YYYY-MM-DD | 1000-01-01 | 9999-12-03 |
| DATETIME | 日期时间 | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-03 23:59:59 |
| TIMESTAMP | 日期时间 | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 UTC | 2038-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种方式:
- 可以使用带冒号的字符串,比如“D HH:MM:SS”、“HH:MM:SS”、“HH:MM”、“D HH:MM”、“D HH”或“SS”格式。其中D表示天,最小值是0,最大值是34。如果使用带有D格式的字符串插入数据时,D会被转化为小时,计算格式为D*24+HH。当使用带有冒号并且不带D的字符串时,表示当天的时间。
- 可以使用不带冒号的字符串或数字,格式为“HHMMSS”或HHMMSS。如果插入一个不合法的字符串或数字,MySQL在存储数据时,会将其自动转化为00:00:00进行存储。比如1210,MySQL会将最右边的两位解析成秒,表示00:12:10,而不是12:10:00。
- 使用CURRENT_TIME()或者NOW(),会插入当前系统的时间。
DATE类型
DATE类型表示日期,没有时间。
插入数据时,可以3种方式:
- 使用YYYY-MM-DD或者YYYYMMDD表示字符串日期,其最小取值为1000-01-01,最大值为9999-12-03。其中YYYYMMDD格式会被转化为YYYY-MM-DD格式。
- 使用YY-MM-DD或YYMMDD格式表示的字符串日期,此格式中,年份为两位数值或字符串。当年份取值为00到69时,会被转化为2000到2069,当年份取值为70到99时,会被转化为1970到1999。当使用的是数字时,运行存在隐式转换。
- 使用CURRENT_DATE()或者NOW()函数,插入当前系统的日期。
DATETIME类型
DATETIME类型表示日期时间。
插入数据时,可以使用3种方式:
- 使用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格式。
- 使用YY-MM-DD HH:MM:SS或者YYMMDDHHMMSS格式插入时,两位数的年份规则否和YEAR类型的规则,当年份取值为00到69时,会被转化为2000到2069,当年份取值为70到99时,会被转化为1970到1999。
- 使用函数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类型区别
- TIMESTAMP存储空间小,表示的日期时间范围也比较小。
- 底层存储方式不同,TIMESTAMP底层存储的是毫秒值,距离1970-01-01 00:00:00毫秒的毫秒值。
- 两个日期比较大小或日期计算时,TIMESTAMP更方便,更快。
- TIMESTAMP与时区有关。TIMESTAMP会根据用户的时区不同,显示不同的结果。而DATETIME则只能反映出插入时当地的时区,其他时区的人查看数据必然会有误差。
经验
开发中使用最多的是日期时间类型,就是DATETIME。因为这个类型包含了完整的日期和时间信息,取值范围也很大,使用起来比较方便。一般用于计算的不建议使用DATETIME存储,而是使用时间戳,因为DATETIME虽然直观,但是不便于计算。
今天先学习到这里,明天继续。