MySQL - 比较两个负时间值

MySQL - Comparing Two Negative Time Values

我的 SQL 查询中有以下条件语句:

WHERE TIMEDIFF("03:00:00", VARIABLE) >= "00:05:00"

以上按预期工作。如果 TIMEDIFF() 返回的值大于 5 分钟,则返回它所代表的记录。如果 TIMEDIFF() returns -02:00:00-00:05:0000:04:00,则该记录将被排除。如果是returns00:06:00或者01:02:00,对应的记录就会被包含在查询结果中。

我需要将上面的条件语句更新为:

WHERE TIMEDIFF("03:00:00", VARIABLE) >= "-00:05:00"

在更新后的语句中,结果中只应包含大于或等于 -00:05:00 的值。我注意到情况并非如此。甚至 TIMEDIFF() 返回的具有相应较大负值的记录 - 即。 -05:00:00-02:00:00-00:06:00 - 与此新条件语句一起返回。

MySQL 似乎无法将两个负时间值相互比较。

有什么办法可以准确写出这个比较?

使用TIME_TO_SEC将时间格式转换为整数秒然后比较您的值

喜欢下面

where TIME_TO_SEC(TIMEDIFF("03:00:00", VARIABLE))>=-300

嗯,您可以使用 TIMESTAMPDIFF (documentation),为此,您需要将硬编码值转换两次(如果您直接将其转换为 datetime,它 TIMESTAMPDIFF 将无法正常工作),像这样:

create table tbl (t time);
insert into tbl values ("00:06:00"), ("00:03:00"), ("-00:06:00"), ("-00:03:00");
-- here you can see how it works
select *,
       TIMESTAMPDIFF(SECOND, cast(cast("00:05:00" as time) as datetime), cast(t as datetime))
from tbl;

提到的函数将 return 一个整数,这将很容易与 :)

进行比较

Mysql 可以处理 -838:59:59838:59:59 范围内的时间。

首先,您应该确保TIMEDIFF() return的时间正确。例如,在负时间的情况下,TIMEDIFF() 可以 return 使用 jdbc driver 时出错。 你可以用简单的查询来检查它:

SELECT TIMEDIFF("02:55:00", "03:00:00")

如果结果为“-05:00:00”,则驱动程序正常工作。

其次,您应该手动将时间值转换为时间类型,因为 MySQL 可能会错误地将负时间值转换为时间类型。

WHERE TIMEDIFF("03:00:00", VARIABLE) >= TIME("-00:05:00")

例如:

SELECT TIMEDIFF("03:00:00", "3:00:00") >= "-00:05:00"; // return true
SELECT TIMEDIFF("03:00:00", "3:10:00") >= "-00:05:00"; // return true

此查询始终 returns true,但如果您将“-00:05:00”转换为手动时间输入,此查询将 return 正确结果

SELECT TIMEDIFF("03:00:00", "3:00:00") >= TIME("-00:05:00"); // return true
SELECT TIMEDIFF("03:00:00", "3:10:00") >= TIME("-00:05:00"); // return false