表示时间值的日期和时间数据类型有DATE
、
TIME
、
DATETIME
、
TIMESTAMP
和
YEAR
。
对于范围描述,
DATE
“
支持”意味着尽管早期的值可能有效,但不能保证。
DATETIME
MySQL 允许
、 和
值的小数秒TIME
,
精度可达微秒(6 位)。要定义包含小数秒部分的列,请使用语法
,其中is
、
或
,并且
是小数秒精度。例如:
DATETIME
TIMESTAMP
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
列都可以具有自动初始化和更新属性;参见
第 11.2.6 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”。
一个约会。支持的范围是
'1000-01-01'
到'9999-12-31'
. MySQLDATE
以格式显示值 ,但允许使用字符串或数字 将值分配给 列。'
YYYY-MM-DD
'DATE
日期和时间组合。支持的范围是
'1000-01-01 00:00:00.000000'
到'9999-12-31 23:59:59.999999'
. MySQLDATETIME
以格式显示值 ,但允许使用字符串或数字 将值分配给 列。'
YYYY-MM-DD hh:mm:ss
[.fraction
]'DATETIME
可以给出 0 到 6 范围内的可选
fsp
值以指定小数秒精度。值为 0 表示没有小数部分。如果省略,则默认精度为 0。DATETIME
可以使用DEFAULT
和 列定义子句指定列 的自动初始化和更新到当前日期和时间ON UPDATE
,如第 11.2.6 节“TIMESTAMP 和 DATETIME 的自动初始化和更新”中所述。一个时间戳。范围是
'1970-01-01 00:00:01.000000'
UTC 到'2038-01-19 03:14:07.999999'
UTC。 值存储为自纪元( UTC)TIMESTAMP
以来的秒数。'1970-01-01 00:00:00'
ATIMESTAMP
不能表示该值'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
系统变量的值(参见 第 5.1.7 节,“服务器系统变量”)。如果
explicit_defaults_for_timestamp
启用,则不会自动将DEFAULT CURRENT_TIMESTAMP
或ON UPDATE CURRENT_TIMESTAMP
属性分配给任何TIMESTAMP
列。它们必须显式包含在列定义中。此外,任何TIMESTAMP
未明确声明为NOT NULL
允许NULL
值。如果
explicit_defaults_for_timestamp
禁用,服务器处理TIMESTAMP
如下:除非另有说明,否则表中的第一
TIMESTAMP
列被定义为自动设置为最近修改的日期和时间(如果未明确分配值)。这TIMESTAMP
对于记录INSERT
orUPDATE
操作的时间戳很有用。您还可以TIMESTAMP
通过为其分配一个值来将任何列设置为当前日期和时间NULL
,除非它已被定义NULL
为允许NULL
值的属性。可以使用列定义子句指定自动初始化
DEFAULT CURRENT_TIMESTAMP
和更新到当前日期和时间。ON UPDATE CURRENT_TIMESTAMP
默认情况下,第一TIMESTAMP
列具有这些属性,如前所述。但是,TIMESTAMP
表中的任何列都可以定义为具有这些属性。一个时间。范围
'-838:59:59.000000'
是'838:59:59.000000'
. MySQLTIME
以格式显示值 ,但允许使用字符串或数字 将值分配给 列。'
hh:mm:ss
[.fraction
]'TIME
可以给出 0 到 6 范围内的可选
fsp
值以指定小数秒精度。值为 0 表示没有小数部分。如果省略,则默认精度为 0。4 位数格式的年份。MySQL
YEAR
以格式显示值 ,但允许 使用字符串或数字YYYY
将值分配给列。YEAR
值显示为1901
,2155
或0000
。笔记YEAR(2)
数据类型已弃用,MySQL 5.7.5 中删除了对它的支持 。要将 2 位列转换YEAR(2)
为 4位列YEAR
,请参阅第 11.2.5 节,“2 位 YEAR(2) 限制和迁移到 4 位 YEAR”。有关
YEAR
显示格式和输入值解释的其他信息,请参阅第 11.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;
MySQL 服务器可以在
MAXDB
启用 SQL 模式的情况下运行。在这种情况下,TIMESTAMP
与 相同DATETIME
。如果在创建表时启用此模式,则会将
TIMESTAMP
列创建为DATETIME
列。因此,此类列使用
DATETIME
显示格式,具有相同的值范围,并且不会自动初始化或更新到当前日期和时间。请参阅
第 5.1.10 节,“服务器 SQL 模式”。
从 MySQL 5.7.22 开始,MAXDB
已弃用;希望它在未来版本的 MySQL 中被删除。