Sqlite: bieżący znacznik czasu jest w GMT, a nie w strefie czasowej maszyny
Mam tabelę sqlite (v3) z definicją Kolumny:
"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP
Serwer, na którym działa ta baza danych, znajduje się w strefie czasowej CST. Gdy wstawiam do tabeli bez włączania kolumny znacznika czasu, SQLite automatycznie zapełnia to pole bieżącym znacznikiem czasu w GMT, a nie CST.
Czy istnieje sposób, aby zmodyfikować moją instrukcję insert, aby wymusić zapisanie znacznika czasu w CST? Z drugiej strony, prawdopodobnie lepiej przechowywać go w GMT (w przypadku, gdy baza danych zostanie przeniesiona do na przykład inna strefa czasowa), więc czy istnieje sposób, w jaki mogę zmodyfikować mój select SQL, aby przekonwertować zapisany znacznik czasu na CST po wyodrębnieniu go z tabeli?
11 answers
Znalazłem w dokumentacji sqlite ( https://www.sqlite.org/lang_datefunc.html) ten tekst:
Oblicz datę i godzinę podaną uniksowi timestamp 1092941466, and compensation dla Twojej lokalnej strefy czasowej.
SELECT datetime(1092941466, 'unixepoch', 'localtime');
To nie wyglądało, jakby pasowało do moich potrzeb, więc próbowałem nieco zmienić funkcję "datetime" i skończyło się na tym:
select datetime(timestamp, 'localtime')
To wydaje się działać - czy jest to prawidłowy sposób konwersji dla strefy czasowej, czy jest lepszy sposób na zrobić to?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-17 03:04:33
Po prostu Użyj czasu lokalnego jako domyślnego:
CREATE TABLE whatever(
....
timestamp DATE DEFAULT (datetime('now','localtime')),
...
);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 14:42:08
Należy, co do zasady, pozostawić znaczniki czasu w bazie danych w GMT i przekonwertować je na / 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:
SELECT DATETIME(col, 'PDT')
... wyświetlenie znacznika czasu dla użytkownika na Pacific Daylight Time. Niestety, to nie działa. Zgodnie z Ten samouczek SQLite , jednak (przewiń w dół do "inne polecenia daty i czasu"), możesz poprosić o czasu, a następnie zastosować przesunięcie (w godzinach) w tym samym czasie. Tak więc, jeśli znasz przesunięcie strefy czasowej użytkownika, jesteś dobry.
Nie ma jednak do czynienia z zasadami oszczędzania czasu letniego...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-20 08:11:01
W (przyznanym rzadkim) przypadku, że lokalny czas jest poszukiwany (ja, na przykład, przechowuję czas lokalny w jednej z moich baz danych, ponieważ wszystko, co mnie obchodzi, jaka jest godzina w ciągu dnia i nie śledzę, gdzie byłem w okresie stref czasowych...), możesz zdefiniować kolumnę jako
"timestamp" TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M','now', 'localtime'))
Część %Y-%m-%dT%H:%M jest oczywiście opcjonalna; tak właśnie lubię, gdy mój czas jest przechowywany. [Również, jeśli moje wrażenie jest poprawne, nie ma "DATETIME" datatype w sqlite, więc tak naprawdę nie ma znaczenia, czy tekst lub DATETIME jest używany jako typ danych w deklaracji kolumn.]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-21 03:38:59
Gdy kolumna jest zdefiniowana jako " NOT NULL DEFAULT CURRENT_TIMESTAMP
, wstawione rekordy zawsze będą ustawione z czasem UTC / GMT.
Oto, co zrobiłem, aby uniknąć konieczności uwzględniania czasu w moich instrukcjach INSERT/UPDATE:
--Create a table having a CURRENT_TIMESTAMP:
CREATE TABLE FOOBAR (
RECORD_NO INTEGER NOT NULL,
TO_STORE INTEGER,
UPC CHAR(30),
QTY DECIMAL(15,4),
EID CHAR(16),
RECORD_TIME NOT NULL DEFAULT CURRENT_TIMESTAMP)
--Create before update and after insert triggers:
CREATE TRIGGER UPDATE_FOOBAR BEFORE UPDATE ON FOOBAR
BEGIN
UPDATE FOOBAR SET record_time = datetime('now', 'localtime')
WHERE rowid = new.rowid;
END
CREATE TRIGGER INSERT_FOOBAR AFTER INSERT ON FOOBAR
BEGIN
UPDATE FOOBAR SET record_time = datetime('now', 'localtime')
WHERE rowid = new.rowid;
END
Przetestuj, czy działa...
--INSERT a couple records into the table:
INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID)
VALUES (0, 1, 'xyz1', 31, '777')
INSERT INTO foobar (RECORD_NO, TO_STORE, UPC, PRICE, EID)
VALUES (1, 1, 'xyz2', 32, '777')
--UPDATE one of the records:
UPDATE foobar SET price = 29 WHERE upc = 'xyz2'
--Check the results:
SELECT * FROM foobar
Mam nadzieję, że to pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 15:07:20
SELECT datetime('now', 'localtime');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 17:53:23
Myślę, że to może pomóc.
SELECT datetime(strftime('%s','now'), 'unixepoch', 'localtime');
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-19 12:53:00
SELECT datetime(CURRENT_TIMESTAMP, 'localtime')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-22 14:36:05
Możesz również przekonwertować kolumnę czasu na znacznik czasu za pomocą strftime ():
SELECT strftime('%s', timestamp) as timestamp FROM ... ;
Daje:
Kolumna tabeli1454521888
'timestamp' może być nawet polem tekstowym, używając domyślnie current_timestamp
.
Bez strftime:
SELECT timestamp FROM ... ;
Daje:
2016-02-03 17:51:28
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-03 18:01:01
Bieżący czas w strefie czasowej Twojej maszyny:
select time(time(), 'localtime');
Zgodnie z http://www.sqlite.org/lang_datefunc.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-14 02:22:32
Time ( 'now', 'localtime' )
I Date ( 'now', 'localtime' )
działa.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-11 12:16:28