Я создаю приложения для Android, и мне нужно сохранить дату / время создания записи. Однако в документации по SQLite говорится: «SQLite не имеет класса хранения, выделенного для хранения дат и / или времени», и «способен хранить даты и время как значения TEXT, REAL или INTEGER».
Есть ли техническая причина использовать один тип вместо другого? И может ли один столбец хранить даты в любом из трех форматов от строки к строке?
Мне нужно будет сравнить даты позже. Например, в своих приложениях я буду показывать все записи, созданные с даты A до даты B. Меня беспокоит, что отсутствие истинного столбца DATETIME может затруднить сравнение.
Ответы:
SQlite не имеет определенного типа datetime. Вы можете использовать
TEXT
,REAL
илиINTEGER
тип, в зависимости от того соответствует вашим потребностям.Прямо из DOCS
Здесь можно найти встроенные функции даты и времени SQLite .
источник
Сказав это, я бы использовал INTEGER и сохранял секунды с эпохи Unix (1970-01-01 00:00:00 UTC).
источник
RSQLite
похоже, преобразовываетPOSIXct
в числовую эпоху, поэтому для меня это работает достаточно хорошо.Одна из мощных функций SQLite - это возможность выбрать тип хранилища. Преимущества / недостатки каждой из трех различных возможностей:
Строка ISO8601
Настоящий номер
Целое число
Если вам нужно сравнить разные типы или экспортировать во внешнее приложение, вы можете использовать собственные функции преобразования даты и времени SQLite по мере необходимости.
источник
localtime_r()
( sqlite.org/lang_datefunc.html#caveats_and_bugs ) в эталонной реализации иlocaltime()
потенциально может быть уязвима для 2038 года, если платформа хоста имеет 32-разрядную версиюtime_t
. Тем не менее, поскольку SQLite утверждает, что защищает от этой возможности путем сопоставления внешних дат с предварительным преобразованием безопасного диапазона (см. Ту же ссылку), я думаю, что это вряд ли будет проблемой, за исключением, может быть, эзотерических случаев.Практически для всех вопросов, касающихся даты и времени, я предпочитаю упрощать вещи, очень, очень просто ... вплоть до секунд, хранящихся в целых числах.
Целые числа всегда будут поддерживаться как целые в базах данных, плоских файлах и т. Д. Вы делаете небольшую математику и преобразуете ее в другой тип, и вы можете отформатировать дату как хотите.
Поступая таким образом, вам не нужно беспокоиться, когда [вставить текущую избранную базу данных здесь] будет заменено на [будущую избранную базу данных], которая по совпадению не использует формат даты, который вы выбрали сегодня.
Это просто небольшая математическая нагрузка (например, методы - занимает две секунды, я опубликую суть, если необходимо) и упрощает многие операции с датой / временем позже.
источник
Сохраните его в поле типа
long
. СмотритеDate.getTime()
иnew Date(long)
источник