参考链接:
https://www.cnblogs.com/wlzjdm/p/6953398.html
https://www.cnblogs.com/alterem/p/12001817.html
日期类型
MySql 中关于日期的类型有 Date / Datetime / Timestamp 三种类型。
日期赋值时,允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。
例如,‘98-12-31 11:30:45’、‘98.12.31 11+30+45’、‘98/12/31 11*30*45’ 和 ‘98@12@31 113045’ 都是等价 的,对于不合法的日期将会转换为:0000-00-00 00:00:00。
Date
存储数据格式为:YYYY-MM-DD,范围为 ‘1000-01-01’ 到 ‘9999-12-31’,并且允许使用字符串或数字赋值。
update t set t_date = 12331212 where t_name = 'name';
update t set t_date = '1233-12-12' where t_name = 'name';
Datetime
日期和时间的组合,存储格式为:YYYY-MM-DD HH:MM:SS。
范围为 ‘1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’,并且允许使用字符串或数字赋值。
update t set t_date = 12331212121212 where t_name = 'name';
update t set t_date = '1233-12-12 12:12:12' where t_name = 'name';
TimeStamp
时间戳,从 1970-01-01 00:00:00 到当前的时间差值,它精确到毫秒级别,范围为:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’。设置值时只允许设置数字类型的值。
在为 TimeStamp 类型字段赋值的时候,值必须大于19700101000000,否则就会抛出错误。
TIMESTAMP 列必须有默认值,默认值可以为“0000-00-00 00:00:00”,但不能为 null。
update t set t_date = 20081212121212 where t_name = 'name';
注意:
- 当在 Java 中输出 new Date(0) 的时候,输出的是:Thu Jan 01 08:00:00 CST 1970,这是因为时区的概念,中国是东八区,对应的是早上八点。
-
TIMESTAMP 和时区相关,更能反映当前时间。当插入日期时,会先转换为本地时区后再存放;当查询日期时,会将日期转换为本地时区后再显示。所以不同时区的人看到的同一时间是不一样的。
-
TIMESTAMP 的属性受 Mysql 版本和服务器 SQLMode 的影响较大。
如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。
一般建表时候,创建时间用datetime,更新时间用 TIMESTAMP。
时间类型
MySQL 中时间类型用 Time 表示。
Time
存储格式为 ‘HH:MM:SS’。范围可以从’-838:59:59’到’838:59:59’。小时部分会因此大的原因是 Time 类型不仅可以用于表示一天的时间(必须小于24小时),还可以用于表示某个事件过去的时间或两个事件之间的时间间隔,所以可以大于24小时,甚至为负。
格式说明:
- ‘HHMMSS’格式的没有间割符的字符串,假定是有意义的时间。例如,‘101112’被理解为’10:11:12’,但’109712’是不合法的(它有一个没有意义的分钟部分),将变为’00:00:00’。
- 超出TIME范围但合法的值被裁为范围最接近的端点。例如,’-850:00:00’和’850:00:00’被转换为’-838:59:59’和’838:59:59’。
年类型
MySQL 中用 Year 表示年类型。
Year
存储格式为 YYYY。范围是 1901 到 2155。
可以指定各种格式的 Year 值:
- 四位字符串,范围为’1901’到’2155’。
- 四位数字,范围为 1901 到 2155。
- 两位字符串,范围为’00’到’99’。'00’到’69’和’70’到’99’范围的值被转换为 2000 到 2069 和 1970 到 1999 范围的 Year 值。
- 两位整数,范围为 1 到 99。1到69和70到99范围的值被转换为2001到2069和1970到1999范围的 Year 值。注意两位整数范围与两位字符串范围稍有不同,因为你不能直接将零指定为数字并将它解释为 2000。你必须将它指定为一个字符串’0’或’00’或者它被解释为0000。
- 非法YEAR值被转换为0000。
日期兼容性问题
- MySQL 服务器采用了 Unix 的时间功能,对于 TIMESTAMP 值,可处理的日期至 2037 年。对于 DATE 和 DATETIME 值,可接受的日期可至 9999 年。
- 所有的 MySQL 日期函数均是在 1 个源文件:sql/time.cc中实现的,并经过了恰当编码以确保 2000 年安全。
- 在 MySQL 3.22 和以后的版本中,YEAR 列类型能够在1个字节内保存 0 年以及1901~2155年,并能使用两位或四位数字显示它们。所有的两位数字年份均被视为介于1970~2069年之间,这意味着,如果你在 YEAR 列中保存了01,MySQL 服务器会将其当作 2001 年。
5 种类型对比
日期时间类型 | 占用空间 | 日期格式 | 最小值 | 最大值 | 零值表示 |
---|---|---|---|---|---|
DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP | 4 bytes | YYYY-MM-DD HH:MM:SS | 19700101080001 | 2038 年的某个时刻 | 00000000000000 |
DATE | 4 bytes | YYYY-MM-DD | 1000-01-01 | 9999-12-31 | 0000-00-00 |
TIME | 3 bytes | HH:MM:SS | -838:59:59 | 838:59:59 | 00:00:00 |
YEAR | 1 bytes | YYYY | 1901 | 2155 | 0000 |