如何使用MySQL的MAKETIME函数构造小于1小时的负时间?
How to construct negative time less than 1 hour using MAKETIME function of MySQL?
来自 MySQL 开发站点 -
- 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
来自 MySQL 开发站点 -
- 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