Як вставити значення дати в базу даних SQLite?


109

Я намагаюся вставити значення дати в базу даних 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'

тобто yyyy-MM-dd HH: мм: сс

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


Як одне замовлення за датою з такими рядками?
ІгорГанапольський

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
FYI, .xxxxxxтут у синтаксисі @ TorValamo = .SSS=% f в документації на SQLite, тобто дробові секунди.
Flak DiNenno

2
DateTime.parse ('2016-05-28 14:27:00 -0300'). Строп ('% 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. РРРР-ММ-ДД HH: ММ
  3. РРРР-ММ-ДД HH: MM: SS
  4. РРРР-ММ-ДД HH: MM: SS.SSS
  5. РРРР-ММ-DDTHH: ММ
  6. РРРР-ММ-DDTHH: MM: SS
  7. РРРР-ММ-DDTHH: MM: SS.SSS
  8. НН: ММ
  9. HH: MM: SS
  10. HH: MM: SS.SSS
  11. зараз

Довідка: Функції дати та часу SQLite


Хоча в таблиці не вказано, документи також вказують, що ви можете додати "Z" або компенсації, такі як "-0400"
coolaj86

10

Використовуйте, CURRENT_TIMESTAMPколи вам це потрібно, замість OF NOW()(що є MySQL)


1
це працює, одне не так. CURRENT_TIMESTAMP дата повернення без UTC, чи знаєте ви, як вирішити цю проблему. Спасибі заздалегідь!
Ulug'bek Ro'zimboyev

8

Прочитайте це : DateНайкращий тип даних для зберігання дати та часу у форматі 1.2 та Time Data:

TEXT найкращий формат: yyyy-MM-dd HH:mm:ss

Потім прочитайте цю сторінку; це найкраще пояснити про дату та час у SQLite. Я сподіваюся, що це допоможе тобі


5
Вам слід розглянути відповідь на запитання із посиланнями, які підтримують вашу відповідь, а не просто купою посилань
Gonzalo.-

0

Це може бути не найпопулярнішим або ефективним методом, але я схильний відмовлятися від сильних типів даних у SQLite, оскільки всі вони, по суті, скидаються як рядки.

Я раніше писав тонку обгортку C # навколо бібліотеки SQLite (звичайно, коли використовуєте SQLite з C #, звичайно), щоб обробляти вставки та витяги до та з SQLite так, як ніби я маю справу з об'єктами DateTime.


Не обрізає його за датами, якщо, наприклад, ви хотіли сортувати за цим полем; ви закінчуєте порівняння рядків ...
G__
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.