복붙노트

[SQL] SQLite는 : CURRENT_TIMESTAMP 기계의하지 시간대, GMT에

SQL

SQLite는 : CURRENT_TIMESTAMP 기계의하지 시간대, GMT에

나는이 열 정의와 sqlite가 (V3) 테이블이 있습니다 :

"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP

이 데이터베이스가 살아 계심 서버는 CST 시간대에 있습니다. 내가 타임 스탬프 열을 포함하지 않고 내 테이블에 삽입 할 때, SQLite는 자동으로 그리니치 표준시의 현재 타임 스탬프하지 CST와 해당 필드를 채 웁니다.

CST에 있어야 저장된 타임 스탬프를 강제로 내 삽입 문을 수정하는 방법이 있나요? 다른 한편으로는 그래서 나는 CST에 저장된 타임 스탬프를 변환하는 나의 선택 SQL을 수정할 수있는 방법이있다, (경우에 데이터베이스가 예를 들어, 다른 시간대로 이동됩니다) GMT에 저장 아마 더 낫다 테이블에서 추출?

해결법

  1. ==============================

    1.나는 sqlite가 문서 (https://www.sqlite.org/lang_datefunc.html)이 텍스트에서 발견 :

    나는 sqlite가 문서 (https://www.sqlite.org/lang_datefunc.html)이 텍스트에서 발견 :

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

    즉, 내 요구에 맞게처럼 조금 주위에 "날짜"기능을 변경 시도, 그래서보고,이와 상처하지 않았다 :

    select datetime(timestamp, 'localtime')
    

    당신의 시간대에 변환 할 수있는 올바른 방법이, 또는이 할 수있는 더 좋은 방법이있다 - 그것은 작동하는 것 같다?

  2. ==============================

    2.단순히 기본값으로 로컬 시간을 사용합니다 :

    단순히 기본값으로 로컬 시간을 사용합니다 :

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

    3.당신이해야 원칙적으로, 휴가는 GMT에서 데이터베이스에 타임 스탬프, 오직 변환에 / 당신이 사용자의 (안 서버의) 지역의 타임 스탬프로 변환 할 수있는 입력 / 출력, 로컬 시간에서.

    당신이해야 원칙적으로, 휴가는 GMT에서 데이터베이스에 타임 스탬프, 오직 변환에 / 당신이 사용자의 (안 서버의) 지역의 타임 스탬프로 변환 할 수있는 입력 / 출력, 로컬 시간에서.

    다음 작업을 수행 할 수 있다면 좋은 일 것입니다 :

    SELECT DATETIME(col, 'PDT')
    

    ... 태평양 일광 절약 시간에 사용자의 출력 타임 스탬프. 불행하게도, 그 작동하지 않습니다. 이 SQLite는 튜토리얼에 따르면, 그러나 ( "다른 날짜 및 시간 명령"아래로 스크롤), 당신은 시간을 요구하고 오프셋 (시간) 같은 시간에 적용 할 수 있습니다. 당신이 알고한다면, 사용자의 시간대는 당신에게,있는 거 좋은 오프셋.

    하지만, 일광 절약 규칙을 처리하지 않습니다 ...

  4. ==============================

    4.로컬 datatime은 내가, 예를 들어, 모든 I 관리부터 내 데이터베이스 중 하나의 현지 시간을 저장 (원하고있는 (인정 드문) 경우였다 하루에 시간이 무엇이고 나는 어디를 추적하지 않습니다 시간대 ...)의 관점에서, 당신은 열을 정의 할 수 있습니다

    로컬 datatime은 내가, 예를 들어, 모든 I 관리부터 내 데이터베이스 중 하나의 현지 시간을 저장 (원하고있는 (인정 드문) 경우였다 하루에 시간이 무엇이고 나는 어디를 추적하지 않습니다 시간대 ...)의 관점에서, 당신은 열을 정의 할 수 있습니다

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

    Y-는 % % % M- DT % H % M 부분은 물론 선택적이다; 내가 내 시간이 저장 될 좋아 다만 방법이다. [내 인상이 정확한지는 TEXT 또는 DATETIME 컬럼 선언의 데이터 유형으로 사용되는 정말 문제가 있는지 여부 않도록 또한,이 sqlite에는 "DATETIME"데이터 형식이 없습니다.]

  5. ==============================

    5."NOT NULL시 기본 CURRENT_TIMESTAMP,"로 정의 된 열을 가진 경우 삽입 된 기록은 항상 UTC / GMT 시간으로 설정 얻을 것이다.

    "NOT NULL시 기본 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
    

    희망이 도움이.

  6. ==============================

    6.

    SELECT datetime('now', 'localtime');
    
  7. ==============================

    7.SELECT 날짜 (CURRENT_TIMESTAMP '의 현지')

    SELECT 날짜 (CURRENT_TIMESTAMP '의 현지')

  8. ==============================

    8.당신은 또한 단지의 strftime ()를 사용하여 타임 스탬프 시간 열을 변환 할 수 있습니다 :

    당신은 또한 단지의 strftime ()를 사용하여 타임 스탬프 시간 열을 변환 할 수 있습니다 :

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

    당신은 제공합니다 :

    "타임 스탬프"테이블 컬럼 CURRENT_TIMESTAMP DEFAULT로를 사용하여, 심지어 텍스트 필드 일 수있다.

    의 strftime 없음 :

    SELECT timestamp FROM ... ;
    

    당신은 제공합니다 :

  9. ==============================

    9.나는이 힘의 도움을 생각합니다.

    나는이 힘의 도움을 생각합니다.

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

    10.현재 시간, 컴퓨터의 시간대에서 :

    현재 시간, 컴퓨터의 시간대에서 :

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

    http://www.sqlite.org/lang_datefunc.html에 따라

  11. ==============================

    11.시간 ( '지금', '의 현지') 및 날짜 ( '지금', '의 현지')가 작동합니다.

    시간 ( '지금', '의 현지') 및 날짜 ( '지금', '의 현지')가 작동합니다.

  12. from https://stackoverflow.com/questions/381371/sqlite-current-timestamp-is-in-gmt-not-the-timezone-of-the-machine by cc-by-sa and MIT license