#mysql #sql #datetime #date-arithmetic
#mysql #sql #datetime #дата-арифметика
Вопрос:
Я пытаюсь переключиться с использования временных меток UNIX на DATETIME
столбцы в MySQL, и у меня возникают небольшие проблемы с поиском правильного способа сравнения между датами.
Я попытался использовать операторы
и -
для сравнения двух DATETIME
, но результаты не имеют для меня никакого смысла.
Например:
1.
SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() - INTERVAL 1 HOUR
Выводит
2014-07-06 19:19:13 | 2014-07-06 18:19:13
Эти
SELECT UTC_TIMESTAMP() - DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 HOUR)
SELECT UTC_TIMESTAMP() - (UTC_TIMESTAMP() - INTERVAL 1 HOUR)
Оба вывода 10000
. Это число не имеет смысла для меня, но тогда оно становится еще более запутанным, поскольку это:
SELECT UTC_TIMESTAMP()-DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 SECOND)
Выводит 1
. Почему это? Что представляет это число?
2.
Страница руководства по функциям даты и времени показывает DATE_ADD()
, что DATE_SUB()
их можно использовать для добавления и вычитания интервалов из дат, но я не вижу в руководстве никаких функций, соответствующих операторам great than и less than, так как же мне проверить, не больше ли текущая дата какой-либо другой даты?
Я пытался использовать операторы <
и >
, и они, кажется, работают, но я, похоже, ничего не могу найти по этому поводу в руководстве и хочу убедиться, что можно использовать эти операторы следующим образом:
SELECT UTC_TIMESTAMP() > DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 HOUR)
Может ли кто-нибудь демистифицировать DATETIME
сравнения в MySQL?
Ответ №1:
Процитировать документацию о UTC_TIMESTAMP()
:
Возвращает текущую дату и время UTC в виде значения в формате ‘ГГГГ-ММ-ДД ЧЧ: ММ:СС’ или ГГГГМДДХХМ ММСС, в зависимости от того, используется ли функция в строковом или числовом контексте.
Поскольку значение используется в контексте числа, оно обрабатывается как число, что и является тем поведением, которое вы видите.
Ответ №2:
Я только что узнал об этом сам, но вот краткий пример, который показывает вам, как это работает.
Ответ @GordonLinoff ни здесь, ни там, потому что ваш вопрос на самом деле не о формате, возвращаемом из utc_timestamp()
. На самом деле вы спрашиваете, какой формат возвращает MySQL при использовании числовых операндов
и -
для временных меток.
Я склонен согласиться с вами, что документация немного нечеткая по теме. Но это то, что я нашел. Вы можете создать это представление самостоятельно, чтобы увидеть пример в более простых терминах.
create view cbhview as
select utc_timestamp() as nowtime,
utc_timestamp() - interval 1 hour as thentime,
date_sub(utc_timestamp(),INTERVAL 1 HOUR) as thentime2,
date_sub(utc_timestamp(),INTERVAL 1 SECOND) as justthentime;
select nowtime, thentime, thentime2, justthentime,
nowtime-thentime,
nowtime-justthentime,
thentime-thentime2
from cbhview;
--------------------- --------------------- --------------------- --------------------- ------------------ ---------------------- --------------------
| nowtime | thentime | thentime2 | justthentime | nowtime-thentime | nowtime-justthentime | thentime-thentime2 |
--------------------- --------------------- --------------------- --------------------- ------------------ ---------------------- --------------------
| 2014-07-06 20:22:58 | 2014-07-06 19:22:58 | 2014-07-06 19:22:58 | 2014-07-06 20:22:57 | 10000 | 1 | 0 |
--------------------- --------------------- --------------------- --------------------- ------------------ ---------------------- --------------------
1 row in set (0.00 sec)
100000
представляет1h 00min 00second
1
представляет1second
0
не представляет никакой разницы между этими двумя
Короче говоря, если вы точно не знаете, что вы делаете и чего именно пытаетесь достичь, не используйте числовые операнды для date
и timestamp
типов данных. Придерживайтесь функций, которые были разработаны для этой цели date_add()
и date_sub()
.
Комментарии:
1. Спасибо, это многое проясняет. Итак, использование
и
-
для значений datetime не приводит к желаемому результату, но как насчет большего / меньшего, чем сравнения? Является ли использование<
и>
подходящим способом проверки, является ли одно значение datetime больше / меньше другого?2. @Nate Да, конечно, вы можете использовать
>
,<=
и другие операторы для сравнения. Фильтрация ваших данных была бы довольно сложной, если бы вы не могли этого сделать.select * from cbhview where nowtime<thentime;
3. @Nate Я только что увидел, что ты пытаешься сделать. Да, вы также можете поместить логические компараторы в
select
инструкцию, но это не фильтрует (как это было бы вwhere
части инструкции). Итак, еще раз, будьте осторожны, чтобы знать, чего вы хотите. Вselect
инструкции логический компаратор выдает вамtrue/false
(фактически1/0
) ответ.select nowtime<thentime from cbhview;
. ИТАК, подсказка: не задавайте 2 вопроса в 1! Создайте отдельные вопросы, если вы хотите разделить их.