用于表示时间值的日期和时间数据类型为 DATE
、TIME
、DATETIME
、TIMESTAMP
和 YEAR
。
对于 DATE
和 DATETIME
范围描述,“支持”意味着虽然早期值可能有效,但没有保证。
MySQL 允许 TIME
、DATETIME
和 TIMESTAMP
值使用小数秒,精度最高可达微秒(6 位)。要定义包含小数秒部分的列,请使用语法
,其中 type_name
(fsp
)type_name
是 TIME
、DATETIME
或 TIMESTAMP
,而 fsp
是小数秒精度。例如
CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));
如果给出,则 fsp
值必须在 0 到 6 的范围内。值为 0 表示没有小数部分。如果省略,则默认精度为 0。(这与标准 SQL 的默认值 6 不同,为了与以前的 MySQL 版本兼容。)
任何表中的 TIMESTAMP
或 DATETIME
列都可以具有自动初始化和更新属性;请参见 第 13.2.5 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”。
日期。支持的范围是
'1000-01-01'
到'9999-12-31'
。MySQL 以'
格式显示YYYY-MM-DD
'DATE
值,但允许使用字符串或数字为DATE
列分配值。日期和时间组合。支持的范围是
'1000-01-01 00:00:00.000000'
到'9999-12-31 23:59:59.499999'
。MySQL 以'
格式显示YYYY-MM-DD hh:mm:ss
[.fraction
]'DATETIME
值,但允许使用字符串或数字为DATETIME
列分配值。可以在 0 到 6 的范围内给出可选的
fsp
值,以指定小数秒精度。值为 0 表示没有小数部分。如果省略,则默认精度为 0。可以使用
DEFAULT
和ON UPDATE
列定义子句指定DATETIME
列的自动初始化和更新,如 第 13.2.5 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新” 中所述。时间戳。范围是
'1970-01-01 00:00:01.000000'
UTC 到'2038-01-19 03:14:07.499999'
UTC。TIMESTAMP
值存储为自纪元('1970-01-01 00:00:00'
UTC)以来的秒数。一个TIMESTAMP
无法表示值'1970-01-01 00:00:00'
,因为这等效于纪元以来的 0 秒,而值 0 用于表示'0000-00-00 00:00:00'
,即“零”TIMESTAMP
值。可以在 0 到 6 的范围内给出可选的
fsp
值,以指定小数秒精度。值为 0 表示没有小数部分。如果省略,则默认精度为 0。服务器处理
TIMESTAMP
定义的方式取决于explicit_defaults_for_timestamp
系统变量的值(请参见 第 7.1.8 节,“服务器系统变量”)。如果启用了
explicit_defaults_for_timestamp
,则不会自动将DEFAULT CURRENT_TIMESTAMP
或ON UPDATE CURRENT_TIMESTAMP
属性分配给任何TIMESTAMP
列。它们必须在列定义中显式包含。此外,任何未显式声明为NOT NULL
的TIMESTAMP
都允许NULL
值。如果禁用了
explicit_defaults_for_timestamp
,则服务器按如下方式处理TIMESTAMP
除非另有说明,否则表中的第一个
TIMESTAMP
列被定义为自动设置为最近修改的日期和时间,除非显式分配值。这使得TIMESTAMP
对于记录INSERT
或UPDATE
操作的时间戳很有用。您还可以通过为任何TIMESTAMP
列分配NULL
值来将其设置为当前日期和时间,除非它已定义了NULL
属性以允许NULL
值。可以使用
DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
列定义子句指定自动初始化和更新为当前日期和时间。默认情况下,第一个TIMESTAMP
列具有这些属性,如前所述。但是,表中的任何TIMESTAMP
列都可以定义为具有这些属性。时间。范围为
'-838:59:59.000000'
到'838:59:59.000000'
。MySQL 以'
格式显示hh:mm:ss
[.fraction
]'TIME
值,但允许使用字符串或数字将值分配给TIME
列。可以在 0 到 6 的范围内给出可选的
fsp
值,以指定小数秒精度。值为 0 表示没有小数部分。如果省略,则默认精度为 0。4 位格式的年份。MySQL 以
YYYY
格式显示YEAR
值,但允许使用字符串或数字将值分配给YEAR
列。值显示为1901
到2155
,或0000
。有关
YEAR
显示格式和输入值解释的更多信息,请参见 第 13.2.4 节“YEAR 类型”。
SUM()
和 AVG()
聚合函数不适用于时间值。(它们将值转换为数字,丢失第一个非数字字符之后的所有内容。)要解决此问题,请转换为数字单位,执行聚合操作,然后转换回时间值。示例
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;