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

Неустранимая ошибка: не может использовать возвращаемое значение функции в контексте записи

Это обычно происходит при непосредственном использовании функции с empty.

Пример:

if (empty(is_null(null))) {
  echo 'empty';
}

Это связано с тем, что empty - это языковая конструкция, а не функция, она не может быть вызвана с выражением в качестве аргумента в версиях PHP до 5.5. До PHP 5.5 аргумент empty() должен быть переменной , но произвольное выражение (такое как возвращаемое значение функции) допустимо в PHP 5.5 +.

empty, несмотря на его имя, на самом деле не проверяет, является ли переменная «пустой». Вместо этого он проверяет, существует ли переменная, или == false. Выражения (например, is_null(null) в примере) всегда будут считаться существующими, поэтому здесь empty проверяет только, равен ли он false. Здесь вы можете заменить empty() на !, например. if (!is_null(null)), или явно сравнить с ложным, например. if (is_null(null) == false).

Вопросы, относящиеся

114
задан Benjamin 13 July 2014 в 22:56
поделиться

6 ответов

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

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

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

, Который не был похож на него, соответствуют моим потребностям, таким образом, я пытался менять функцию "даты и времени" немного, и завершенный с этим:

select datetime(timestamp, 'localtime')

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

138
ответ дан Stephan 24 November 2019 в 02:32
поделиться

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

было бы хорошо, если Вы могли бы сделать следующее:

SELECT DATETIME(col, 'PDT')

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

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

15
ответ дан Roger Lipscombe 24 November 2019 в 02:32
поделиться

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

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

%Y-% m-% dT%H: % M часть является, конечно, дополнительным; это, как мне нравится, когда мое время хранится. [Кроме того, если мое впечатление корректно, в sqlite нет никакого типа данных "ДАТЫ И ВРЕМЕНИ", таким образом, это действительно не имеет значения или ТЕКСТ, или ДАТА И ВРЕМЯ используется в качестве типа данных в объявлении столбца.]

13
ответ дан polyglot 24 November 2019 в 02:32
поделиться

Я думаю, что это могло бы помочь.

SELECT datetime(strftime('%s','now'), 'unixepoch', 'localtime');
3
ответ дан Alex 24 November 2019 в 02:32
поделиться

Если столбец определен с помощью " НЕ НУЛЕВОЙ ТЕКУЩИЙ_ВРЕМЯ ПО УМОЛЧАНИЮ ," для вставленных записей всегда устанавливается время 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
ответ дан 24 November 2019 в 02:32
поделиться

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

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);
61
ответ дан 24 November 2019 в 02:32
поделиться
Другие вопросы по тегам:

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