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:00
或 00: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:59
到 838: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
我的 SQL 查询中有以下条件语句:
WHERE TIMEDIFF("03:00:00", VARIABLE) >= "00:05:00"
以上按预期工作。如果 TIMEDIFF() 返回的值大于 5 分钟,则返回它所代表的记录。如果 TIMEDIFF() returns -02:00:00
、-00:05:00
或 00: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:59
到 838: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