ОБНОВЛЕНИЕ
Фактическое значение в базе данных 1593742280658
Это выглядит как Unix время эпохи в миллисекундах с которым SQLite не справляется. Вам нужно превратить его в секунды, а затем указать strftime
, что вы хотите unix эпоху с модификатором unixepoch
.
sqlite> SELECT strftime('%Y-%m-%d', 1593742280658/1000, 'unixepoch');
strftime('%Y-%m-%d', 1593742280658/1000, 'unixepoch')
-----------------------------------------------------
2020-07-03
Почему -471-11-24
? Вот что вы получите от SELECT strftime('%Y-%m-%d', 0);
. Без модификатора unixepoch
SQLite интерпретирует целое число как номер юлианского дня , количество дней с 24 ноября 4714 г. B C.
Вы получаете -471, а не - 4714, потому что %Y
имеет место только для четырех символов. select date(0)
даст полный -4713-11-24
.
С select strftime('%Y-%m-%d', 1593742280658)
SQLite пытается интерпретировать 1593742280658 как юлианские дни. Это выходит далеко за пределы заданного диапазона, поэтому может случиться что угодно.
Эти функции работают только для дат между 0000-01-01 00:00:00 и 9999-12-31 23:59:59 ( числа юлианских дней от 1721059,5 до 5373484,5). Для дат вне этого диапазона результаты этих функций не определены.
В моей реализации я получаю пустую строку. В твоем вроде бы получился юлианский день 0.
И столбец даты - это тип даты
SQLite не имеет реального типа даты .
SQLite не имеет класса хранения зарезервированы для хранения дат и / или времени. Вместо этого встроенные функции даты и времени SQLite могут сохранять дату и время как значения TEXT, REAL или INTEGER:
- TEXT как строки ISO8601 ("YYYY-MM-DD HH: MM: SS.SSS ").
- REAL как числа дней по юлианскому календарю, количество дней, прошедших с полудня по Гринвичу 24 ноября 4714 г. по Б. C. в соответствии с пролепти c григорианским календарем.
- INTEGER как Unix Время, количество секунд с 1970-01-01 00:00:00 UT C.
И в отличие от других SQL баз данных, типы SQLite определяются значением. Он проигнорирует ваше объявление типа.
Любой столбец в базе данных SQLite версии 3, кроме столбца INTEGER PRIMARY KEY, может использоваться для хранения значения любого класса хранения.
Если вы поместите 42
в nameTable.date
, оно будет сохранено как целое число. Если вы поместите 'fourty-two'
в nameTable.date
, он будет сохранен как текст.