表示时态值的日期和时间数据类型为日期
,时间
,DATETIME
,时间戳
,一年
。
为日期
和DATETIME
范围描述,”支持”意味着尽管早期的值可能有效,但不能保证。
MySQL允许小数秒时间
,DATETIME
,时间戳
值,具有高达微秒(6位数字)的精度。要定义包含小数秒部分的列,请使用语法
,在那里type_name
(fsp
)type_name
是时间
,DATETIME
,或时间戳
,fsp
是分数秒精度。例如:
CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));
的fsp
值,如果给定,则必须在0到6之间。值为0表示没有小数部分。如果省略,默认精度为0。(这不同于标准SQL默认的6,以与以前的MySQL版本兼容。)
任何时间戳
或DATETIME
表中的列可以具有自动初始化和更新属性;看到第11.2.5节“TIMESTAMP和DATETIME的自动初始化和更新”。
一个日期。支持的范围为
“1000-01-01”
来“9999-12-31”
。MySQL显示日期
值'
格式,但允许将值赋值给YYYY-MM-DD
'日期
使用字符串或数字的列。日期和时间的组合。支持的范围为
“1000-01-01 00:00:00.000000”
来“9999-12-31 23:59:59.999999”
。MySQL显示DATETIME
值'
格式,但允许将值赋值给YYYY-MM-DD hh: mm: ss
(。分数
]“DATETIME
使用字符串或数字的列。一个可选的
fsp
取值范围从0到6可以指定分数秒精度。值为0表示没有小数部分。如果省略,默认精度为0。自动初始化并更新为当前日期和时间
DATETIME
列可以使用默认的
和在更新
列定义子句,如中所述第11.2.5节“TIMESTAMP和DATETIME的自动初始化和更新”。一个时间戳。范围是
“1970-01-01 00:00:01.000000”
UTC,“2038-01-19 03:14:07.999999”
UTC。时间戳
值被存储为自epoch (“1970-01-01”就是
UTC)。一个时间戳
不能表示值“1970-01-01”就是
因为这相当于从纪元开始算起的0秒而0的值被保留用来表示“0000-00-00”就是
,”零”时间戳
价值。一个可选的
fsp
取值范围从0到6可以指定分数秒精度。值为0表示没有小数部分。如果省略,默认精度为0。服务器处理的方式
时间戳
的值决定定义explicit_defaults_for_timestamp
系统变量(见第5.1.8节,“服务器系统变量”).如果
explicit_defaults_for_timestamp
启用时,没有自动分配默认CURRENT_TIMESTAMP
或在更新CURRENT_TIMESTAMP
任何属性时间戳
列。它们必须显式包含在列定义中。此外,任何时间戳
未显式声明为非空
许可证零
值。如果
explicit_defaults_for_timestamp
禁用,服务器处理时间戳
如下:除非另有说明,第一个
时间戳
表中的列定义为,如果未显式分配值,则自动设置为最近修改的日期和时间。这使得时间戳
用于记录的时间戳插入
或更新
操作。你也可以设置任何时间戳
将当前日期和时间赋值为零
值,除非已用零
属性允许零
值。可以使用命令指定自动初始化和更新到当前日期和时间
默认CURRENT_TIMESTAMP
和在更新CURRENT_TIMESTAMP
列定义条款。默认情况下,是第一个时间戳
列具有这些属性,如前所述。然而,任何时间戳
表中的列可以定义为具有这些属性。一段时间。范围是
“838:59:59.000000”
来“838:59:59.000000”
。MySQL显示时间
值'
格式,但允许将值赋值给hh: mm: ss
(。分数
]“时间
使用字符串或数字的列。一个可选的
fsp
取值范围从0到6可以指定分数秒精度。值为0表示没有小数部分。如果省略,默认精度为0。4位数格式的一年。MySQL显示
一年
值YYYY
格式,但允许将值赋值给一年
使用字符串或数字的列。值显示为1901
来2155
,或0000
。有关有关
一年
输入值的显示格式和解释,请参见第11.2.4节,“年份类型”。请注意从MySQL 8.0.19开始,
(4)
不建议使用显式显示宽度的数据类型;你应该期望在MySQL的未来版本中删除对它的支持。相反,使用一年
没有显示宽度,这有同样的含义。MySQL 8.0不支持2位数
(2)
旧版本MySQL中允许的数据类型。有关转换为4位数字的说明一年
,请参阅2位数年份的限制和向4位数年份的迁移,在MySQL 5.7参考手册。
的SUM ()
和AVG ()
聚合函数不能用于时态值。(它们将值转换为数字,丢失第一个非数字字符之后的所有内容。)要解决这个问题,请转换为数字单位,执行聚合操作,然后再转换回时间值。例子:
选择SEC_TO_TIME(总和(TIME_TO_SEC (time_col)))tbl_name;选择FROM_DAYS(总和(TO_DAYS (date_col)))tbl_name;