Сравнения DATETIME?

#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! Создайте отдельные вопросы, если вы хотите разделить их.