Как мне вставить значение datetime в базу данных SQLite?


110

Я пытаюсь вставить значение datetime в базу данных SQLite . Кажется, все прошло успешно, но когда я пытаюсь получить значение, возникает ошибка:

<Невозможно прочитать данные>

Операторы SQL:

create table myTable (name varchar(25), myDate DATETIME)
insert into myTable (name,mydate) Values ('fred','jan 1 2009 13:22:15')

Ответы:


153

Вам нужен следующий формат:

'2007-01-01 10:00:00'

т.е. гггг-ММ-дд ЧЧ: мм: сс

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


Как с такими строками упорядочить по дате?
IgorGanapolsky

3
Когда вы форматируете даты таким образом, порядок дат и лексический порядок работают одинаково. Например, '2008-02-01'> '2007-02-01', '2008-01-02'> '2008-01-01' как строки, так и даты. Но вам не нужно строго об этом заботиться, потому что SQLite ORDER BY позаботится о заказе за вас.
itowlson

7
Обратите внимание, что вы не можете надежно сравнивать даты с разной точностью, используя лексический порядок, например «SELECT '2007-01-02 10:00:00'> '2007-01-02 10:00';» возвращает 1, но «SELECT datetime ('2007-01-02 10:00:00')> datetime ('2007-01-02 10:00');» возвращает 0.
Шейн

@itowlson Как это будет работать, если у вас многоязычное приложение?
Batmaci

46

Способ хранения дат в SQLite:

 yyyy-mm-dd hh:mm:ss.xxxxxx

SQLite также имеет некоторые функции даты и времени, которые вы можете использовать. См. Раздел « SQL в понимании SQLite», «Функции даты и времени» .


3
К вашему сведению, .xxxxxxздесь, в синтаксисе @ TorValamo = .SSS=% f в документации SQLite, т.е. дробные секунды.
Flak DiNenno

2
DateTime.parse ('2016-05-28 14:27:00 -0300'). Strftime ('% Y-% m-% d% H:% M:% S')
rodvlopes

17

Вы должны изменить формат строки даты, которую вы предоставляете, чтобы иметь возможность вставить ее с помощью функции STRFTIME. Причина в том, что нет возможности для сокращения месяца:

%d  day of month: 00
%f  fractional seconds: SS.SSS
%H  hour: 00-24
%j  day of year: 001-366
%J  Julian day number
%m  month: 01-12
%M  minute: 00-59
%s  seconds since 1970-01-01
%S  seconds: 00-59
%w  day of week 0-6 with sunday==0
%W  week of year: 00-53
%Y  year: 0000-9999
%%  % 

Альтернативой является форматирование даты / времени в уже принятый формат:

  1. ГГГГ-ММ-ДД
  2. ГГГГ-ММ-ДД ЧЧ: ММ
  3. ГГГГ-ММ-ДД ЧЧ: ММ: СС
  4. ГГГГ-ММ-ДД ЧЧ: ММ: СС.ССС
  5. ГГГГ-ММ-ДДТЧЧ: ММ
  6. ГГГГ-ММ-ДДТЧЧ: ММ: СС
  7. ГГГГ-ММ-ДДТЧЧ: ММ: СС.ССС
  8. ЧЧ: ММ
  9. ЧЧ: ММ: СС
  10. ЧЧ: ММ: СС.ССС
  11. сейчас

Ссылка: Функции даты и времени SQLite


Хотя это не указано в таблице, в документации также указано, что вы можете добавить 'Z' или смещения, такие как '-0400'
coolaj86

10

Используйте, CURRENT_TIMESTAMPкогда вам это нужно, вместо OF NOW()(MySQL)


1
это сработало, одно не так. CURRENT_TIMESTAMP возвращает datetime без UTC, знаете ли вы, как решить эту проблему. Заранее спасибо!
Улугбек Розимбоев

8

Прочтите это : 1.2 Dateи Time Datatype лучший тип данных для хранения даты и времени:

TEXT лучший формат: yyyy-MM-dd HH:mm:ss

Тогда прочтите эту страницу; это лучше всего объясняет дату и время SQLite. Я надеюсь это поможет тебе


5
Вам следует подумать об ответе на вопрос,
указав

0

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

Раньше я писал тонкую оболочку C # вокруг библиотеки SQLite (конечно, при использовании SQLite с C #) для обработки вставок и извлечений в и из SQLite, как если бы я имел дело с объектами DateTime.


Не подходит для дат, если, например, вы хотите отсортировать по этому полю; в результате получается сравнение строк ...
G__ 05
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.