2009-12-19 15 views
90

Próbuję wstawić wartość datetime do bazy danych SQLite. Wydaje się sucsessful ale gdy próbuję pobrać wartość jest błąd:Jak wstawić wartość datetime do bazy danych SQLite?

<Unable to read data>

SQL instrukcje są:

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

Odpowiedz

119

Format czego potrzebujesz to:

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

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

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

+0

Jak jedno zamówienie według daty z takich ciągów? –

+3

Podczas formatowania dat takich jak to, porządkowanie dat i porządkowanie leksykalne działają tak samo. Na przykład. "2008-02-01"> "2007-02-01", "2008-01-02"> "2008-01-01" zarówno jako ciągi, jak i daty. Ale nie musisz się tym specjalnie przejmować, ponieważ SQLite ORDER BY zajmie się zamówieniem. – itowlson

+5

Należy zauważyć, że nie można wiarygodnie porównać dat z różną precyzją, stosując porządek leksykalny, np. "WYBIERZ" 2007-01-02 10:00:00 "> '2007-01-02 10:00';" zwraca 1, ale "WYBIERZ datetime (" 2007-01-02 10:00:00 ")> datetime (" 2007-01-02 10:00 ");" zwraca 0. – Shane

40

Sposób przechowywania dat w SQLite jest:

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

SQLite ma także pewne funkcje daty i godziny można użyć. Zobacz SQL As Understood By SQLite, Date And Time Functions.

+1

FYI, '.xxxxxx' tutaj w @ składnia TorValamo =' .SSS' =% f w dokumentacji SQLite, tj. Ułamkowe sekundy. –

+2

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

16

Musisz zmienić format ciągu daty, który chcesz podać, aby móc go wstawić za pomocą funkcji STRFTIME. Powodem jest, nie ma opcji na skrót 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 format daty/godziny do już przyjętego formatu:

  1. YYYY-MM-DD
  2. YYYY- MM-DD HH: MM
  3. RR-MM-DD HH: MM: SS
  4. RR-MM-DD HH: MM: SS.SSS
  5. RR-MM DDTgg: MM
  6. RR-MM DDTgg: MM: SS
  7. RR-MM DDTgg: MM: SS.SSS
  8. HH: MM
  9. HH: MM: SS
  10. HH: MM: SS.SSS
  11. teraz

referencyjny: SQLite Date & Time functions

+0

Chociaż nie jest wymienione w tabeli dokumenty również stwierdzają, że możesz dodać "Z" lub przesunięcia, takie jak "-0400" – CoolAJ86

0

To może nie być najbardziej popularne lub skuteczna metoda, ale mają tendencję do rezygnacji silne typy danych w SQLite sinc Wszystkie one są w gruncie rzeczy wyrzucane jako struny.

Napisałem cienkie opakowanie C# dookoła biblioteki SQLite przed (przy użyciu SQLite z C#, oczywiście) do obsługi wstawiania i ekstrakcji do iz SQLite, tak jakbym miał do czynienia z obiektami DateTime.

+0

Nie obcinają go dla dat, np. chciałeś sortować według tego pola; kończy się to porównywaniem ciągów ... – Greg

+2

Porównywanie ciągów dat działa dobrze z poleceniem YYYY-MM-DD. – dan04

5

Przeczytaj This: 1.2 Date i czas Datatype najlepszy typ danych do daty i czasu przechowywania jest:

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

Następnie odczytać this strony; najlepiej wyjaśnić datę i godzinę w SQLite. Mam nadzieję, że to pomoże Ci

+3

Powinieneś rozważyć odpowiedź na pytanie, z linkami, które wspierają twoją odpowiedź, a nie tylko grupą linków –

5

Zastosowanie CURRENT_TIMESTAMP gdy jest to potrzebne, zamiast NOW() (co jest MySQL)

+1

to działa, jedno jest złe. CURRENT_TIMESTAMP zwraca datetime bez UTC, czy wiesz, jak rozwiązać ten problem. Z góry dziękuję! –

Powiązane problemy