Jak wstawić wartość daty i godziny do bazy danych SQLite?

109

Próbuję wstawić wartość daty i godziny do bazy danych SQLite . Wygląda na to, że się udało, ale gdy próbuję pobrać wartość, pojawia się błąd:

<Nie można odczytać danych>

Instrukcje SQL to:

create table myTable (name varchar(25), myDate DATETIME)
insert into myTable (name,mydate) Values ('fred','jan 1 2009 13:22:15')
Ćwiek
źródło

Odpowiedzi:

153

Potrzebny format to:

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

tj. rrrr-MM-dd HH: mm: ss

Jeśli to możliwe, użyj zapytania sparametryzowanego, ponieważ uwalnia Cię to od martwienia się o szczegóły formatowania.

itowlson
źródło
Jak uporządkować według daty z takimi ciągami?
IgorGanapolsky
3
Kiedy formatujesz daty w ten sposób, kolejność dat i porządek leksykalny działają tak samo. Np. „2008-02-01”> „2007-02-01”, „2008-01-02”> „2008-01-01” zarówno jako ciągi znaków, jak i jako daty. Ale nie musisz się tym przejmować, ponieważ SQLite ORDER BY zajmie się zamówieniem za Ciebie.
itowlson
7
Zauważ, że nie możesz wiarygodnie porównywać dat z różną precyzją przy użyciu porządku leksykalnego, np. "SELECT '2007-01-02 10:00:00'> '2007-01-02 10:00';" zwraca 1, ale „SELECT datetime ('2007-01-02 10:00:00')> datetime ('2007-01-02 10:00');" zwraca 0.
Shane
@itowlson Jak to będzie działać, jeśli masz aplikację wielojęzyczną?
batmaci
46

Sposób przechowywania dat w SQLite to:

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

SQLite ma również kilka funkcji daty i czasu, których możesz użyć. Zobacz SQL w rozumieniu funkcji SQLite, daty i czasu .

Tor Valamo
źródło
3
FYI, .xxxxxxtutaj w składni @ TorValamo = .SSS=% f w dokumentacji SQLite, tj. Ułamki sekund.
Flak DiNenno,
2
DateTime.parse ('2016-05-28 14:27:00 -0300'). Strftime ('% Y-% m-% d% H:% M:% S')
rodvlopes
17

Musisz zmienić format dostarczanego ciągu daty, aby móc go wstawić za pomocą funkcji STRFTIME. Powodem jest to, że nie ma opcji skrótu miesiąca:

%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
%%  % 

Alternatywą jest sformatowanie daty / godziny do już zaakceptowanego formatu:

  1. RRRR-MM-DD
  2. RRRR-MM-DD GG: MM
  3. RRRR-MM-DD HH: MM: SS
  4. RRRR-MM-DD GG: MM: SS.SSS
  5. RRRR-MM-DDTHH: MM
  6. RRRR-MM-DDTHH: MM: SS
  7. RRRR-MM-DDTHH: MM: SS.SSS
  8. HH: MM
  9. HH: MM: SS
  10. HH: MM: SS.SSS
  11. teraz

Odniesienie: Funkcje daty i czasu w SQLite

Kucyki OMG
źródło
Chociaż nie jest to wymienione w tabeli, dokumentacja stwierdza również, że można dodać „Z” lub przesunięcia, takie jak „
-0400
10

Używaj, CURRENT_TIMESTAMPgdy tego potrzebujesz, zamiast OF NOW()(czyli MySQL)

zamrażanie_
źródło
1
to działa, jedna rzecz jest nie tak. CURRENT_TIMESTAMP zwraca datetime bez UTC, czy wiesz, jak rozwiązać ten problem. Z góry dziękuję!
Ulug'bek Ro'zimboyev
8

Przeczytaj to : 1.2 Datei Time Datatype najlepszym typem danych do przechowywania daty i godziny jest:

TEXT najlepszy format to: yyyy-MM-dd HH:mm:ss

Przeczytaj stronę; najlepiej wyjaśnić datę i godzinę w formacie SQLite. Mam nadzieję, że to ci pomoże

Ali Amanzadegan
źródło
5
Powinieneś rozważyć odpowiedź na pytanie, z linkami, które wspierają twoją odpowiedź, a nie tylko
zbiorem
0

Może nie jest to najbardziej popularna ani wydajna metoda, ale mam tendencję do rezygnacji z silnych typów danych w SQLite, ponieważ i tak są one w zasadzie wrzucane jako ciągi.

Napisałem już cienką otokę C # wokół biblioteki SQLite (oczywiście używając SQLite z C #), aby obsługiwać wstawianie i wyodrębnianie do iz SQLite, tak jakbym miał do czynienia z obiektami DateTime.

Niechlujny
źródło
Nie wycina go na daty, jeśli np. Chcesz sortować według tego pola;
kończysz