[sql] SQLite : CURRENT_TIMESTAMP는 컴퓨터의 시간대가 아닌 GMT입니다.

이 열 정의가있는 sqlite (v3) 테이블이 있습니다.

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

이 데이터베이스가있는 서버는 CST 시간대에 있습니다. 타임 스탬프 열을 포함하지 않고 테이블에 삽입하면 sqlite는 CST가 아닌 GMT의 현재 타임 스탬프로 해당 필드를 자동으로 채 웁니다.

저장된 타임 스탬프가 CST에 있도록 강제로 삽입 문을 수정하는 방법이 있습니까? 반면에 GMT에 저장하는 것이 더 좋을 것입니다 (예 : 데이터베이스가 다른 시간대로 이동하는 경우). 테이블에서 추출 하시겠습니까?



답변

sqlite 문서 ( https://www.sqlite.org/lang_datefunc.html )에서이 텍스트를 찾았습니다 .

유닉스 타임 스탬프 1092941466이 주어진 날짜와 시간을 계산하고 현지 시간대를 보정합니다.

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

내 요구에 맞지 않는 것 같았 기 때문에 “datetime”기능을 약간 변경해 보았습니다.

select datetime(timestamp, 'localtime')

작동하는 것 같습니다. 시간대를 변환하는 올바른 방법입니까, 아니면 더 좋은 방법이 있습니까?


답변

현지 시간을 기본값으로 사용하십시오.

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);


답변

일반적으로 타임 스탬프를 GMT로 데이터베이스에 남겨두고 사용자 (서버가 아님)의 로컬 타임 스탬프로 변환 할 수있는 경우에만 입력 / 출력시 로컬 시간으로 /부터 변환해야합니다.

다음을 수행 할 수 있다면 좋을 것입니다.

SELECT DATETIME(col, 'PDT')

… Pacific Daylight Time에 사용자의 타임 스탬프를 출력합니다. 불행히도 그것은 작동하지 않습니다. 그러나이 SQLite 자습서 에 따르면 ( “Other Date and Time Commands”로 스크롤) 시간을 요청한 다음 오프셋 (시간 단위)을 동시에 적용 할 수 있습니다. 따라서 사용자의 시간대 오프셋을 알고 있다면 좋습니다.

하지만 일광 절약 규칙은 다루지 않습니다.


답변

(드물게 인정되는) 로컬 데이터 시간이 필요한 경우 (예를 들어, 내가 신경 쓰는 것은 하루 중 몇시 였는지 확인하고 내가 어디에 있었는지 추적하지 않기 때문에 내 데이터베이스 중 하나에 로컬 시간을 저장합니다) 시간대 측면에서 …) 열을 다음과 같이 정의 할 수 있습니다.

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

% Y- % m- % dT % H : % M 부분은 물론 선택 사항입니다. 내 시간을 저장하는 방법입니다. [또한 내 인상이 맞으면 sqlite에 “DATETIME”데이터 유형이 없으므로 열 선언에서 데이터 유형으로 TEXT 또는 DATETIME을 사용하는지 여부는 중요하지 않습니다.]


답변

“”로 정의 된 열이있는 경우 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

도움이되기를 바랍니다.


답변

SELECT datetime('now', 'localtime');


답변

SELECT datetime(CURRENT_TIMESTAMP, 'localtime')