【发布时间】:2021-04-08 15:59:09
【问题描述】:
+ 和 - 运算符是在标准 sql 中定义的日期/时间类型,例如时间、持续时间、日期、日期时间、时间戳。这是 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'
似乎最后三个结果只是胡言乱语(就实际给出有意义的结果而言)。是否有关于时间类型应该如何加减的标准,或者它是未定义的行为,建议使用函数来处理这种东西?
【问题讨论】:
-
据我所知,SQL 标准仅定义了操作
timestamp +/- interval和timestamp - timestamp,但没有定义例如date + time或timestamp + time。例如,Postgres 支持date + time,它只会产生timestamp,但不支持timestamp + time(无论如何这都没有意义)。但timestamp + interval显然是。由于 MySQL 的“时间”类型本质上是伪装的interval(因为它允许超过 24 小时),也许这就是它接受语法的原因 -
@a_horse_with_no_name 谢谢。我认为
timestamp + time可以,不是吗?如果是周五下午 2 点,而您想知道从现在起 3 小时后是什么时间呢?我正在非正式地写它,但这会转化为时间戳+时间/持续时间,对吗? -
“3 小时后”是
interval,所以你需要timestamp + interval。正如我已经写过的:MySQL 的“时间”数据类型实际上并不是 SQL 标准定义的time类型,它代表“一天中的时间”,例如“早上 8 点”或“午夜半点”。 MySQL 的“时间”类型更接近于 SQL 标准中定义为interval hours to minute的内容。 -
我想知道为什么知道或思考这些深奥的东西会有用
-
@MartinSmith:我知道 MySQL 接受它。但这没有任何意义——至少对我和(显然也不是 David542)。不过 Postgres 做了正确的事情:dbfiddle.uk/…(我不得不承认我 am 很惊讶
timestamp + time确实有效)