MySQL - Сравнение двух отрицательных значений времени - PullRequest
0 голосов
/ 15 января 2019

У меня есть следующий условный оператор в моем запросе SQL:

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

Выше работает как ожидалось. Если значение, возвращенное из TIMEDIFF () , превышает 5 минут, возвращаемая запись будет возвращена. Если TIMEDIFF () возвращает -02:00:00, -00:05:00 или 00:04:00, то запись будет исключена. Если он возвращает 00: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 испытывает трудности при сравнении двух отрицательных значений времени друг с другом.

Можно ли точно написать это сравнение?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Хм, вы можете использовать TIMESTAMPDIFF ( документация ), для этого вам необходимо дважды преобразовать свое жестко закодированное значение (если вы приведете его непосредственно к 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;

Упомянутая функция вернет целое число, которое будет легко сравнить с:)

0 голосов
/ 15 января 2019

Mysql может работать со временем в диапазоне от -838:59:59 до 838:59:59.

Во-первых, вы должны убедиться, что TIMEDIFF() возвращает правильное время. Например, TIMEDIFF() может вернуть ошибку при использовании 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

Этот запрос всегда возвращает true, но если вы приведете '-00: 05: 00' к типу времени вручную, эти запросы вернут правильные результаты

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
0 голосов
/ 15 января 2019

используйте TIME_TO_SEC для преобразования формата времени в целую секунду, затем сравните ваши значения

как показано ниже

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