11.2.1 日期和时间数据类型语法

官方文档地址:11.2.1 Date and Time Data Type Syntax


表示时间值的日期和时间数据类型为 DATE,TIME,DATETIME,TIMESTAMP 和 YEAR。

对于 DATE 和 DATETIME 范围的描述,supported意味着虽然早期的值可以工作,但不能保证。

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 列都可以具有自动初始化和自动更新的属性;参见 11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新

  • DATE
    一个日期。支持的范围是'1000-01-01''9999-12-31'。MySQL 以'YYYY-MM-DD'格式显示 DATE 值,但是允许使用字符串或数字向 DATE 列赋值。
  • DATETIME[(fsp)]
    日期和时间的组合。支持的范围为'1000-01-01 00:00:00.000000''9999-12-31 23:59:59.999999'。MySQL 以'YYYY-MM-DD hh:mm:ss[.fraction]'格式显示 DATETIME 值,但是允许使用字符串或数字向 DATETIME 列赋值。

    一个范围从 0 到 6 的可选的fsp值可以指定小数秒精度。值为 0 表示没有小数部分。如果省略,默认精度为 0。

    可以使用DEFAULTON UPDATE列定义子句指定 DATETIME 列的自动初始化和更新到当前日期和时间,参见 11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新
  • TIMESTAMP[(fsp)]
    一个时间戳。范围是 UTC'1970-01-01 00:00:01.000000'到 UTC'2038-01-19 03:14:07.999999'。TIMESTAMP 存储的值为自新纪元(UTC'1970-01-01 00:00:00')以来的秒数。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系统变量的值,参见 5.1.8 Server System Variables

    如果启用了explicit_defaults_for_timestamp,则不会自动分配CURRENT_TIMESTAMP或者ON UPDATE CURRENT_TIMESTAMP属性给任何 TIMESTAMP 列。它们必须显式包含在列定义中。此外,任何未显式声明为NOT NULL的 TIMESTAMP 列都允许NULL值。

    如果explicit_defaults_for_timestamp被禁用,服务器将以如下方式处理时间戳:

    除非另有指定,否则如果没有显式赋值,表中的第一个 TIMESTAMP 列将被定义为最近修改的日期和时间。这使得 TIMESTAMP 对于记录插入或更新操作的时间戳非常有用。您还可以将任何 TIMESTAMP 列设置为当前日期和时间,方法是给它赋一个NULL值,除非用NULL属性定义了它允许NULL值。

    可以使用缺省的CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP列定义子句指定自动初始化和更新到当前日期和时间。默认情况下,第一个 TIMESTAMP 列将具有这些属性,如前所述。但是,表中的任何 TIMESTAMP 列都可以定义为具有这些属性。
  • TIME[(fsp)]
    一段时间。范围是'-838:59:59.000000''838:59:59.000000'。MySQL 以'hh:mm:ss[.fraction]'格式显示 TIME 值。但是允许使用字符串或数字将值分配给 TIME 列。

    一个范围从 0 到 6 的可选的fsp值可以指定小数秒精度。值为 0 表示没有小数部分。如果省略,默认精度为 0。
  • YEAR[(4)]
    四位数字格式的年。MySQL 以'YYYY'格式显示年份值,但是允许使用字符串或数字将值分配给 YEAR 列。值显示为19012155,或0000

    有关 YEAR 显示格式和输入值解释的其他信息,参见 11.2.4 YEAR 类型

注意

在 MySQL 8.0.19 中,带有显式显示宽度的 YEAR(4) 数据类型已被弃用;在未来的 MySQL 版本中,应该会删除对它的支持。相反,使用不带显示宽度的 YEAR,这具有相同的含义。

MySQL 8.0 不支持旧版本 MySQL 中允许的两位数的 YEAR(2) 数据类型。有关将年份转换为四位数字的说明,参见 MySQL 5.7 参考手册的 11.2.5 两位 YEAR(2) 限制和迁移到四位 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;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值