Mam tabelę sqlite (v3) z tą definicją kolumny:
"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP
Serwer, na którym znajduje się ta baza danych, znajduje się w strefie czasowej CST. Kiedy wstawiam do mojej tabeli bez dodawania kolumny timestamp, sqlite automatycznie wypełnia to pole bieżącym znacznikiem czasu w GMT, a nie CST.
Czy istnieje sposób na zmodyfikowanie instrukcji wstawiania, aby wymusić zapisany znacznik czasu w CST? Z drugiej strony, prawdopodobnie lepiej jest przechowywać go w GMT (na przykład w przypadku przeniesienia bazy danych do innej strefy czasowej), więc czy istnieje sposób, aby zmodyfikować mój wybrany SQL, aby przekonwertować zapisany znacznik czasu na CST, kiedy ja wyciągnąć to ze stołu?
Odpowiedzi:
W dokumentacji sqlite ( https://www.sqlite.org/lang_datefunc.html ) znalazłem ten tekst:
To nie wyglądało tak, jakby pasowało do moich potrzeb, więc spróbowałem nieco zmienić funkcję „datetime” i skończyło się na tym:
Wydaje się, że to działa - czy to właściwy sposób na konwersję dla Twojej strefy czasowej, czy też jest lepszy sposób na zrobienie tego?
źródło
po prostu użyj czasu lokalnego jako domyślnego:
źródło
Zasadniczo należy pozostawić znaczniki czasu w bazie danych w formacie GMT i konwertować je na czas lokalny / z czasu lokalnego na wejściu / wyjściu tylko wtedy, gdy można je przekonwertować na lokalny znacznik czasu użytkownika (nie serwera).
Byłoby miło, gdybyś mógł wykonać następujące czynności:
... do wyprowadzenia sygnatury czasowej użytkownika według czasu pacyficznego letniego. Niestety to nie działa. Jednak zgodnie z tym samouczkiem SQLite (przewiń w dół do „Inne polecenia dotyczące daty i godziny”) możesz zapytać o czas, a następnie jednocześnie zastosować przesunięcie (w godzinach). Tak więc, jeśli znasz przesunięcie strefy czasowej użytkownika, jesteś dobry.
Nie zajmuje się jednak zasadami czasu letniego ...
źródło
W (przyznanym rzadkim) przypadku, gdy potrzebny jest lokalny czas danych (na przykład przechowuję czas lokalny w jednej z moich baz danych, ponieważ obchodzi mnie tylko, która godzina była w ciągu dnia i nie śledzę, gdzie byłem pod względem stref czasowych ...), możesz zdefiniować kolumnę jako
Część% Y-% m-% dT% H:% M jest oczywiście opcjonalna; po prostu lubię przechowywać swój czas. [Ponadto, jeśli moje wrażenie jest poprawne, w sqlite nie ma typu danych „DATETIME”, więc nie ma znaczenia, czy jako typ danych w deklaracji kolumny jest używany TEXT czy DATETIME.]
źródło
Gdy kolumna jest zdefiniowana za pomocą „
NOT NULL DEFAULT CURRENT_TIMESTAMP
,” wstawione rekordy będą zawsze ustawiane według czasu UTC / GMT.Oto, co zrobiłem, aby uniknąć konieczności uwzględniania czasu w moich instrukcjach INSERT / UPDATE:
Sprawdź, czy działa ...
Mam nadzieję, że to pomoże.
źródło
źródło
SELECT datetime(CURRENT_TIMESTAMP, 'localtime')
źródło
Możesz także po prostu przekonwertować kolumnę czasu na znacznik czasu za pomocą strftime ():
Daje Ci:
Kolumna tabeli „sygnatura czasowa” może być nawet polem tekstowym, przy użyciu opcji
current_timestamp
DEFAULT.Bez strftime:
Daje Ci:
źródło
Myślę, że to może pomóc.
źródło
Bieżący czas w strefie czasowej Twojego komputera:
Zgodnie z http://www.sqlite.org/lang_datefunc.html
źródło
Time ( 'now', 'localtime' )
i Data( 'now', 'localtime' )
działa.źródło