Sqlite: CURRENT_TIMESTAMP находится в GMT, а не часовой пояс машины

У меня есть таблица sqlite (v3) с этим определением столбца:

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

Сервер, на котором работает эта база данных, находится в часовом поясе КНТ. Когда я вставляю в таблицу без ввода столбца timestamp, sqlite автоматически заполняет это поле текущей меткой времени в GMT, а не CST.

Есть ли способ изменить мой оператор insert, чтобы заставить сохраненную метку времени находиться в CST? С другой стороны, вероятно, лучше сохранить его в GMT (в случае, если база данных будет перемещена в другой часовой пояс, например), так что я могу изменить мой SQL-код, чтобы преобразовать сохраненную метку времени в CST, когда я извлечь его из таблицы?

+93
19 дек. '08 в 15:53
источник поделиться
11 ответов

Я нашел в документации sqlite (https://www.sqlite.org/lang_datefunc.html) этот текст:

Вычислить дату и время с помощью unix временную отметку 1092941466 и компенсировать для вашего локального часового пояса.

SELECT datetime(1092941466, 'unixepoch', 'localtime');

Это не выглядело так, как будто это соответствовало моим потребностям, поэтому я попытался немного изменить функцию "datetime" и получил это:

select datetime(timestamp, 'localtime')

Кажется, что это работает - это правильный способ конвертировать для вашего часового пояса, или есть лучший способ сделать это?

+113
19 дек. '08 в 16:04
источник

просто используйте локальное время по умолчанию:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);
+51
30 мая '10 в 14:42
источник

Связанные вопросы


Похожие вопросы

Вы должны, как правило, оставлять отметки времени в базе данных в GMT и только конвертировать их в/из локального времени на входе/выходе, когда вы можете преобразовать их в локальную метку времени пользователя (не сервера).

Было бы неплохо, если бы вы могли сделать следующее:

SELECT DATETIME(col, 'PDT')

... для вывода метки времени для пользователя в режиме Pacific Daylight Time. К сожалению, это не сработает. В соответствии с этот учебник по SQLite (прокрутите вниз до "Другие команды даты и времени" ), вы можете запросить время, а затем применить смещение (в часах) в одно и то же время. Итак, если вы знаете смещение часового пояса пользователя, вы хорошо.

Не соблюдает правила летнего времени, хотя...

+13
19 дек. '08 в 16:08
источник

В (признанном редком случае) случае, когда требуется местное время (я, например, храню локальное время в одной из моей базы данных, так как все, что мне нужно, это то, что было в тот день, и я не отслеживаю где я был в зоне часовых поясов...), вы можете определить столбец как

"timestamp" TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M','now', 'localtime'))

Часть% Y-% m-% dT% H:% M, конечно, необязательна; это то, как мне нравится мое время для хранения. [Также, если мое впечатление верное, в sqlite нет типа данных DATETIME, поэтому на самом деле не имеет значения, используется ли TEXT или DATETIME в качестве типа данных в объявлении столбца.]

+12
21 февр. '09 в 3:38
источник

При наличии столбца, определенного с помощью "NOT NULL DEFAULT CURRENT_TIMESTAMP", вставленные записи всегда будут установлены с временем UTC/GMT.

Вот что я сделал, чтобы не включать время в свои инструкции 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

Проверьте, работает ли он...

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

Надеюсь, что это поможет.

+8
11 авг. '09 в 18:11
источник
SELECT datetime('now', 'localtime');
+6
16 янв. '14 в 17:53
источник

SELECT datetime(CURRENT_TIMESTAMP, 'localtime')

+3
22 апр. '15 в 14:36
источник

Я думаю, это может помочь.

SELECT datetime(strftime('%s','now'), 'unixepoch', 'localtime');
+2
20 февр. '09 в 23:46
источник

Текущее время в часовом поясе вашего компьютера:

select time(time(), 'localtime');

По http://www.sqlite.org/lang_datefunc.html

+2
14 нояб. '12 в 2:22
источник

Time ( 'now', 'localtime' ) и дата ( 'now', 'localtime' ).

+1
07 нояб. '14 в 5:26
источник

Вы также можете просто преобразовать столбец времени в метку времени с помощью strftime():

SELECT strftime('%s', timestamp) as timestamp FROM ... ;

Дает вам:

1454521888

Столбец таблицы

'timestamp' может быть текстовым полем даже с использованием current_timestamp как DEFAULT.

Без strftime:

SELECT timestamp FROM ... ;

Дает вам:

2016-02-03 17:51:28

0
03 февр. '16 в 18:01
источник

Посмотрите другие вопросы по меткам или Задайте вопрос