MySQL 日期与时间类型

参考链接:

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。

日期兼容性问题

  1. MySQL 服务器采用了 Unix 的时间功能,对于 TIMESTAMP 值,可处理的日期至 2037 年。对于 DATE 和 DATETIME 值,可接受的日期可至 9999 年。
  2. 所有的 MySQL 日期函数均是在 1 个源文件:sql/time.cc中实现的,并经过了恰当编码以确保 2000 年安全。
  3. 在 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
发布了54 篇原创文章 · 获赞 120 · 访问量 9577

猜你喜欢

转载自blog.csdn.net/siriusol/article/details/105349764