MySQL сравнивает дату с меткой времени

#mysql

#mysql

Вопрос:

У меня есть поле VARCHAR completion_date , которое содержит дату с меткой времени (например, 1319193919). Возможно ли выполнить запрос к такому полю, с которым оно сравнивается NOW() ? Я пытаюсь:

 SELECT * FROM (`surveys`) WHERE `active` = '1' AND `archived` = '0' AND `completion_date` > 'NOW()'
 

Но результаты на самом деле не то, что я ожидаю, является ли это причиной VARCHAR? Если да, то какое поле даты мне лучше использовать? Данные должны оставаться меткой времени Linux.

Ответ №1:

Преобразуйте NOW() в метку времени, используя UNIX_TIMESTAMP()

 SELECT * 
FROM (`surveys`) 
WHERE `active` = '1' AND `archived` = '0' AND `completion_date` > UNIX_TIMESTAMP(NOW())
 

Кроме того, удалите кавычки, которые у вас были вокруг 'NOW()'

 mysql> SELECT UNIX_TIMESTAMP(NOW());
 ----------------------- 
| UNIX_TIMESTAMP(NOW()) |
 ----------------------- 
|            1319288622 |
 ----------------------- 
 

Примечание. Если вам это нужно, обратная функция заключается FROM_UNIXTIME() в преобразовании метки времени в DATETIME формат MySQL по умолчанию.

Как упоминалось в комментариях ниже, если у вас есть возможность внести изменения, рекомендуется использовать реальный DATETIME тип вместо VARCHAR() для этих данных.

Комментарии:

1. чтобы дополнить уже хороший ответ: используйте DATETIME / TIME / DATE в качестве типа поля, если вы хотите легко сохранить свою дату без какого-либо форматирования. Однако VARCHAR работает быстрее, если вам не нужна эта функциональность!

Ответ №2:

Временную метку Linux можно легко сохранить в BIGINT (или UNSIGNED INT), что сделает возможным тип сравнений, которые вы пытаетесь выполнить. VARCHAR собирается выполнить лексическое, а не числовое сравнение, и это НЕ то, что вы хотите. Использование BIGINT в сочетании с преобразованием NOW() с UNIX_TIMESTAMP() помощью должно дать вам то, что вы хотите.

Возможно, было бы даже лучше сохранить его, используя тип данных DATETIME, и выполнить преобразование при выборе данных. Сохранение его в качестве даты и ВРЕМЕНИ в будущем подтвердит ваше приложение в случае, если вы перейдете или добавите другую платформу, где временная метка Linux не подходит. Тогда вам нужно только изменить свой код, а не преобразовать свои данные, чтобы он продолжал работать. Сейчас я работаю над проектом, в котором даты хранились в виде символьных данных, и не было конца проблемам с приведением старых данных в форму для использования в новом приложении, хотя у вас может возникнуть меньше проблем, чем у нас, потому что вы сохраняете метку времени, а не форматированную дату с сопутствующими опечатками.