Как сравнить две даты в SQLite?

Я предположил, что это строка, поэтому я сравнил ее как строку, но не удивительно, что она не удалась. Я считаю, что это работает в Mysql. Я мог ошибаться, поскольку я не работал над этим через некоторое время. В любом случае, как я могу проверить, совпадают ли даты в SQLite? Я буду использовать его в предложении WHERE.

SELECT a._id, b._id, b.start_date,a.event_name, b.start_time, 
b.end_date, b.end_time, b.location FROM events_info b INNER JOIN events a ON
 a._id=b.event_id WHERE b.start_time = '6:00';

(добавлено пространство, чтобы упростить просмотр)

Ответ 1

SQLite не имеет специального типа DATETIME. Обычно люди делают это, чтобы сохранить дату как форматированную строку, которая является последовательной; например, YYYY-MM-DD hh: mm: ss. Если вы это сделаете, если вы согласны, вы можете напрямую сравнивать даты:

SELECT * FROM a WHERE q_date < '2013-01-01 00:00:00';

Это работает, потому что, хотя сравнение технически является алфавитным, а не числовым, датируется в последовательном формате, подобном этому, как в алфавитном, так и в цифровом формате.

Для такой схемы я предлагаю хранить даты в 24-часовом формате (приведенный выше пример - полночь). Pad месяцев, дней и часов с нулями. Если ваши даты будут охватывать несколько часовых поясов, сохраните их все в UTC и сделайте любое преобразование, которое вам нужно на стороне клиента, чтобы преобразовать их в локальный часовой пояс.

Обычно даты и время сохраняются в одном столбце. Если вы хотите, чтобы они были разделены по какой-либо причине, просто убедитесь, что даты совпадают, и ваши времена все последовательны. Например, даты должны быть YYYY-MM-DD, а время должно быть hh: mm: ss.

Причина, по которой YYYY-MM-DD hh: mm: ss является предпочтительным форматом, состоит в том, что, когда вы переходите с самого большого интервала дат (лет) до наименьшего (секунды), вы можете легко индексировать и сортировать их и с высокая производительность.

SELECT * FROM a WHERE q_date = '2012-06-04 05:06:00';

будет использовать индекс для отталкивания даты/времени вместо того, чтобы выполнять полное сканирование таблицы. Или, если они находятся в двух отдельных строках:

SELECT * FROM a WHERE q_date = '2012-06-04' AND q_time = '05:06:00';

Ключ должен убедиться, что даты и время находятся в согласованном формате, входящем в базу данных. Для удобной презентации сделайте все конверсии на стороне клиента, а не в базе данных. (Например, convert '2012-06-04 05:06:00' to "1:06 am Eastern 6/4/2012".)

Если это не отвечает на вопрос, не могли бы вы разместить точный формат, который вы используете для хранения ваших дат и времени, и две примерные даты, которые вы пытаетесь сравнить, которые не работают так, как вы ожидаете их к?

Ответ 2

Sqlite не может напрямую сравнивать даты. мы также должны преобразовать их в секундах, а также в целое число.

Пример

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;

Ответ 3

Из Типы данных В SQLite версии 3:

1.2 Дата и время Тип данных

SQLite не имеет класса хранения, зарезервированного для хранения дат и/или времени. Вместо этого встроенные функции Date and Time Functions > SQLite способны хранить даты и время как значения TEXT, REAL или INTEGER:

  • ТЕКСТ как строки ISO8601 ( "ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС" ).
  • REAL как число юлианских дней, количество дней с полудня в Гринвиче 24 ноября 4714 г. B.C. согласно предсказательному григорианскому календарю.
  • INTEGER как Unix Time, количество секунд с 1970-01-01 00:00:00 UTC.

Приложения могут выбирать даты и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенные функции даты и времени.

Если вы посмотрите на примеры в Функции даты и времени, что-то вроде этого должно приблизить вас к тому, что вы хотите (что, м, предположим, составляет 6:00 текущего дня):

WHERE b.start_time = date('now', 'start of day', '+6 hours')