Как сохранить и получить значение даты и времени в SQLite

Моя таблица содержит поле «Дата рождения», которое имеет тип данных как дату и время. Я хочу получить все записи, имеющие день рождения сегодня. Как я могу это получить?


person Community    schedule 11.09.2009    source источник


Ответы (3)


Попробуйте этот запрос:

SELECT * FROM mytable
WHERE strftime('%m-%d', 'now') = strftime('%m-%d', birthday)
person Nick Dandoulakis    schedule 11.09.2009
comment
Что такое тип данных? Это TEXT? А может BLOB? Было бы полезно, если бы в документации было указано, что использовать для sqlite3_bind_xxxx. И мне было бы любопытно узнать, работают ли другие операторы, например >=, как положено. Также см. функция привязки SQLite в подготовленном операторе. - person jww; 24.03.2019

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

Для общих значений даты и времени используйте временные метки Unix Epoch. С ним легко работать, он чрезвычайно гибкий, а также не зависит от часового пояса (и даже календаря!) (Недавно я написал статью об их использовании, которую мне действительно нужно подключить...)

Тем не менее, если вас интересуют только даты в григорианском календаре, вы можете использовать большое целое число в следующем формате: ГГГГММДД, например, 19761203. Для вашего конкретного использования вы можете даже создать четырехзначное целое число, например ММДД, скажем, 1703. это должно привести к быстрому выбору!

person Leon Matthews    schedule 14.09.2009
comment
Похоже, что SQLite может хранить даты как время unix: sqlite.org/datatype3.html ( См. 1.2 Тип данных даты и времени). Так что никакого потраченного впустую места нет. - person idbrii; 09.11.2010
comment
Что касается хранения вашей даты в виде целого числа, такого как ГГГММДД, как насчет дней рождения, у которых есть даты? А дни рождения в одном месяце? Для извлечения каждого фрагмента даты требуется много операций mod/div. Мне кажется, вам лучше использовать встроенные (а также оптимизированные и читаемые) инструменты базы данных, такие как ответ NickD. - person idbrii; 09.11.2010

SQLite имеет очень плохую поддержку хранения дат. Вы можете использовать метод, предложенный Nick D выше, но имейте в виду, что этот запрос приведет к полному сканированию таблицы, поскольку даты неправильно индексируются в SQLite (на самом деле SQLite вообще не поддерживает даты как встроенный тип).

Если вы действительно хотите сделать быстрый запрос, вам придется добавить отдельный (интегральный) столбец для хранения дня рождения (1-31) и прикрепить к нему индекс в базе данных.

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

Удачи

person Liron Levi    schedule 13.09.2009
comment
DATE или DATETIME будут сохранены как NUMERIC (см. 2.2 Примеры имен соответствия в sqlite.org/datatype3.html) как время unix (см. раздел 1.2 Тип данных даты и времени). Сохранение дня и месяца является возможной оптимизацией, хранение еще одного столбца INTEGER является излишним. - person idbrii; 10.11.2010