date/time 字段的运算符

Operators on date/time fields

+- 运算符在标准 sql 中定义在 date/time 类型上,例如时间、持续时间、日期、日期时间、时间戳。这是来自 MySQL 的示例:

select 
date '1983-09-05', time '01:02:03', timestamp '2014-01-01 01:02:03',
date '1983-09-05' + time '01:02:03', timestamp '1983-09-05 01:02:03' + time '01:02:03'

最后三个结果似乎只是乱码(就实际给出有意义的结果而言)。时间类型应该如何加减是否有标准,或者它是未定义的行为,建议对这种东西使用函数?

MySQL 不会产生乱码。它只是变得困惑。问题是 MySQL 试图弄清楚你的意思:

  • +真的是为了数字加法还是为了date/times?
  • 常量真的是字符串,date/time,还是数字?

MySQL 做出了(可能)违反直觉的选择。例如,date/time 值如 '2014-01-01 01:02:03' 被转换为看起来像 20140101010203 的数字。这种转换在某些情况下会隐式发生。

让我用日期来说明这一点。您可能认为这些是等价的:

select '2021-01-01' + 40,
       date '2021-01-01' + 40,
       '2021-01-01' + interval 40 day

结果是:

2061    20210141    2021-02-10

这是怎么回事?首先,+ 被视为数字加法。第一个参数被转换为数字——即前导数字到第一个非数字。

在第二个中,+ 也被视为数字加法。日期被转换为数字,看起来像 20,210,101 —— 即 YYYYMMDD 作为 integer.

最后,第三个告诉 MySQL 按照您的意愿进行 - 增加 40 天。

这与标准SQL没有任何关系,它明确定义了加减间隔和时间戳的区别。这些只是 MySQL 用于消除 +- 歧义以及将 date/times 转换为数字的规则。