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.