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?

Author: Benjamin, 2008-12-19

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?

 119
Author: BrianH,
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')),
     ...
);
 55
Author: hoju,
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...

 13
Author: Roger Lipscombe,
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.]

 12
Author: polyglot,
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.
 8
Author: Donal Fellows,
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');
 7
Author: liquide,
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');
 3
Author: Alex,
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')

 3
Author: Jens A. Koch,
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:

1454521888

Kolumna tabeli

'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

 3
Author: danger89,
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

 2
Author: Joseph,
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.

 1
Author: Julian,
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