用于表示时间值的日期和时间数据类型为 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;