用于表示时间值日期和时间数据类型为 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
操作的时间戳很有用。您还可以通过将NULL
值分配给任何TIMESTAMP
列将其设置为当前日期和时间,除非它已使用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;