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 转换为数字的规则。
是 +
和 -
运算符在标准 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 转换为数字的规则。