2012-06-04 3 views
12

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

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

вы должны выложили свой «не-рабочий» код –

+0

я не вижу смысла, как я 100% положительное сравнение даты/времени является проблемой. Но если это имеет большое значение, я с радостью обяжусь. Извини за это. – Andy

+0

Под «сравнить две даты» вы имеете в виду «сравнить два раза в день», не так ли? –

ответ

28

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".)

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

+0

Это правда. Но зачем иметь типы, зарезервированные в базе данных LOL. Это просто смущает меня, что позволяет людям создавать столбцы «Дата и время», но при их сравнении он терпит неудачу. Но я мог бы просто создать столбец «Текст». Спасибо. – Andy

+0

Честно говоря, ответ для переносимости. Таким образом, если вы переходите из SQLite в другую систему БД или наоборот, вам не нужно переписывать все ваши запросы. Или, по крайней мере, это намного проще. –

+1

Спасибо. вы сохраняете мой день :) Мой рабочий код: - SELECT * FROM LogDetail WHERE time_Detail> '2014-06-18 23:13:00'; – pkc456

2

От Datatypes In SQLite Version 3:

1,2 Дата и время Datatype

SQLite не имеет набор классов для хранения для хранения дат и/или времени. Вместо этого, встроенный в Date And Time Functions из SQLite способны хранить даты и времени, как TEXT, REAL, или Целые значения:

  • TEXT, как ISO8601 строки ("YYYY-MM-DD HH: MM: SS. SSS ").
  • REAL как число юлианских дней, число дней с полудня в Гринвиче 24 ноября 4714 г. B.C. согласно пролептическому григорианскому календарю.
  • INTEGER as Unix Время, количество секунд начиная с 1970-01-01 00:00:00 UTC.

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

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

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

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

Пример

SELECT * FROM Table 
WHERE 
CAST(strftime('%s', date_field) AS integer) <=CAST(strftime('%s', '2015-01-01') AS integer) ; 
Смежные вопросы