如何使用MySQL的MAKETIME函数构造小于1小时的负时间?

How to construct negative time less than 1 hour using MAKETIME function of MySQL?

来自 MySQL 开发站点 -

MAKETIME function -

  • MAKETIME(hour,minute,second)

Returns a time value calculated from the hour, minute, and second arguments.

The second argument can have a fractional part.

mysql> SELECT MAKETIME(12,15,30);
        -> '12:15:30'

在我的机器上测试后 -

mysql> SELECT MAKETIME(1, 0, 0) AS output;
+----------+
| output   |
+----------+
| 01:00:00 |
+----------+
mysql> SELECT MAKETIME(1, 30, 0) AS output;
+----------+
| output   |
+----------+
| 01:30:00 |
+----------+

现在,尝试构建负时间 -

mysql> SELECT MAKETIME(-1, 0, 0) AS output;
+-----------+
| output    |
+-----------+
| -01:00:00 |
+-----------+
mysql> SELECT MAKETIME(-1, 30, 0) AS output;
+-----------+
| output    |
+-----------+
| -01:30:00 |
+-----------+

现在我尝试使用 MAKETIME 函数构造时间 -00:30:00。我试试 -

mysql> SELECT MAKETIME(-0, 30, 0) AS output;
+----------+
| output   |
+----------+
| 00:30:00 |
+----------+

结果与预期不符。然后我试试 -

mysql> SELECT MAKETIME(0, -30, 0) AS output;
+--------+
| output |
+--------+
| NULL   |
+--------+

我在这里得到一个空输出。

我想不出合适的方法。

我可以做吗?

这似乎是 maketime 功能上的缺陷; mariadb 文档直接说“如果分或秒超出 0 到 60 的范围,则返回 NULL。”这似乎是我可以测试的所有 mysql 和 mariadb 版本的行为。

我建议你改用sec_to_time:

sec_to_time((0)*3600 + (-30)*60 + (0))

此功能似乎不能用于此目的。您可能需要一些字符串操作和最终转换,如:

SELECT CAST(CONCAT_WS(':', '-0', 30, 0) AS TIME);
-00:30:00