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


118

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

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

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

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


24
타임 스탬프를 UTC로 저장하는 것이 모범 사례로 간주됩니다. 발표 할 때 현지 시간으로 변환 합니다.
— csl


1
이런 종류의 문제가 다른 유형의 데이터베이스에 직면했는지 확실하지 않습니다. 일본에서 데이터베이스를 만들면 영국에서 데이터를 사용할 수 있다고 상상할 것입니다!
— NoChance

답변:


145

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

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

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

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

select datetime(timestamp, 'localtime')

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


64

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

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

5
이것은 시간대를 넘어 양도 할 수 없다는 문제가 있습니다.
— Vadim Peretokin 2013 년

예, 그것도 저에게도 작동하지 않습니다. 저는 ZF2에서 sqlite를 사용하고 있습니다
— Rohutech

@iconoclast 당신이 이것을 알고 있고 그것이 당신의 구현을 더 쉽게 만든다면 위험하지 않아야할까요? 이것이 로컬 시간대를 데이터베이스에 저장하는 데만 필요하고 내 응용 프로그램에 다른 방법이 필요하지 않다는 것을 알고 있다면 그렇게 할 것입니다.
— Ahad dec

1
@xFighter 나는 내 응용 프로그램에 다른 방법이 필요하지 않을 것이라는 것을 알고 있습니다 ... 당신이 그것을 잊거나 다른 사람이 그것을 사용하기 전까지는.
— MKesper

16

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

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

SELECT DATETIME(col, 'PDT')

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

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


15

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

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

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


sqlite localtime은 타임 스탬프 및 최종 사용자가 BI 도구를 통해 데이터를 직접 사용하지 않는 응용 프로그램에서 덜 중요 할 수 있습니다. 그러나 localtime은 생년월일과 같은 모든 애플리케이션 특정 날짜를 저장하는 데 사용해야하는 것입니다.
— NoChance

9

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

도움이되기를 바랍니다.


1
사용자 hoju가 제공 한 답변과 다른가요, CREATE TABLE whatever (.... timestamp DATE DEFAULT (datetime ( 'now', 'localtime')),.) ;?
— NoChance



4

strftime ()을 사용하여 시간 열을 타임 스탬프로 변환 할 수도 있습니다.

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

제공합니다 :

1454521888

'timestamp'테이블 열은 current_timestampDEFAULT로를 사용하여 텍스트 필드가 될 수도 있습니다 .

strftime없이 :

SELECT timestamp FROM ... ;

제공합니다 :

2016-02-03 17:51:28


3

도움이 될 것 같습니다.

SELECT datetime(strftime('%s','now'), 'unixepoch', 'localtime');

unxitime; SELECT strftime ( '% s', 'now', 'localtime');
— PodTech.io


1

Time ( 'now', 'localtime' )날짜가 ( 'now', 'localtime' )작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.