#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 не подходит. Тогда вам нужно только изменить свой код, а не преобразовать свои данные, чтобы он продолжал работать. Сейчас я работаю над проектом, в котором даты хранились в виде символьных данных, и не было конца проблемам с приведением старых данных в форму для использования в новом приложении, хотя у вас может возникнуть меньше проблем, чем у нас, потому что вы сохраняете метку времени, а не форматированную дату с сопутствующими опечатками.