Получить день, месяц и день sqlite - PullRequest
0 голосов
/ 12 июля 2020

Когда я хочу получить дату без времени, я использую

SELECT strftime('%Y-%m-%d',date) from nameTable

, я всегда получаю такой результат: -471-11-24

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Вам не нужно strftime() для форматирования даты. Функция date() с модификатором 'unixepoch' вернет дату в формате YYYY-MM-DD:

select date(date / 1000, 'unixepoch') from tablename

Вы должны разделить на 1000, чтобы удалить миллисекунды. Например, для значения типа:

1593742280658

для даты в вашей таблице результат будет

'2020-07-03'

См. demo .

0 голосов
/ 12 июля 2020

ОБНОВЛЕНИЕ

Фактическое значение в базе данных 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, он будет сохранен как текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...