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')

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.


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


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


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)


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


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.


Nie wycina go na daty, jeśli np. Chcesz sortować według tego pola;
kończysz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.