programing

기본값 '지금'으로 타임스탬프 열을 만드는 방법은 무엇입니까?

mbctv 2023. 9. 3. 21:31
반응형

기본값 '지금'으로 타임스탬프 열을 만드는 방법은 무엇입니까?

DATETIME('now')?

다음과 같이:

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP DEFAULT DATETIME('now')
);

오류가 발생합니다.

버전 3.1.0부터 사용할 수 있습니다.CURRENT_TIMESTAMPDEFAULT 절 포함:

열의 기본값이 CURRENT_TIME, CURRENT_DATE 또는 CURRENT_TIMESTAMP인 경우 새 행에 사용되는 값은 현재 UTC 날짜 및/또는 시간을 나타내는 텍스트입니다.CURRENT_TIME의 경우 값의 형식은 "입니다.HH:MM:SS".CURRENT_DATE의 경우 "YYYY-MM-DD"입니다.CURRENT_TIM 스탬프의 형식은 "YYY-MM-DD HH:MM:SS".

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    t TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

박사에 의하면최근 목록 게시물에서 hipp:

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

오류일 괄호가 합니다. 괄호가 필요합니다.(DATETIME('now'))

DEFAULT 조항에 대한 설명서는 다음과 같습니다.

열의 기본값이 괄호 안의 식인 경우 삽입된 각 행과 새 행에 사용된 결과에 대해 식이 한 번 평가됩니다.

구문 다이어그램을 보면 'expr' 주변의 괄호도 볼 수 있습니다.

이는 질문에 대한 다른 답변과 의견을 기반으로 한 전체 예입니다.에서 타임스탬프timestamp)는 과 같습니다.created_at-column)은 unix epoch UTC 시간대로 저장되며 필요한 경우에만 로컬 시간대로 변환됩니다.

unix epoch를 사용하면 저장 공간이 절약됩니다. ISO8601 문자열로 저장된 경우 4바이트 정수가 절약됩니다. 데이터 유형을 참조하십시오.4바이트가 충분하지 않으면 6바이트 또는 8바이트로 늘릴 수 있습니다.

UTC 시간대에 타임스탬프를 저장하면 여러 시간대에 적절한 값을 쉽게 표시할 수 있습니다.

SQLite 버전은 Ubuntu LTS 14.04와 함께 제공되는 3.8.6입니다.

$ sqlite3 so.db
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite> .headers on

create table if not exists example (
   id integer primary key autoincrement
  ,data text not null unique
  ,created_at integer(4) not null default (strftime('%s','now'))
);

insert into example(data) values
 ('foo')
,('bar')
;

select
 id
,data
,created_at as epoch
,datetime(created_at, 'unixepoch') as utc
,datetime(created_at, 'unixepoch', 'localtime') as localtime
from example
order by id
;

id|data|epoch     |utc                |localtime
1 |foo |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
2 |bar |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02

저는 UTC+2 DST에 위치하고 있기 때문에 현지 시간이 맞습니다.

저장 공간을 절약하기 위해 REAL 유형을 사용하는 것이 더 나을 수 있습니다.

SQLite 버전 3의 데이터 유형 1.2 섹션에서 인용

SQLite에는 날짜 및/또는 시간을 저장하기 위해 별도로 설정된 저장소 클래스가 없습니다.대신 SQLite의 내장된 날짜 및 시간 함수는 날짜와 시간을 TEXT, REAL 또는 INTEGER 값으로 저장할 수 있습니다.

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t REAL DEFAULT (datetime('now', 'localtime'))
);

제약 조건을 참조하십시오.

값을 입력하지 않고 행을 삽입합니다.

INSERT INTO "test" DEFAULT VALUES;

괄호를 작성하지 않았기 때문에 구문 오류입니다.

글을 쓰면

datetime('now')을 선택하면 utc 시간이 제공되지만, 이 쓰기 쿼리를 수행할 경우 UTC Time('now')에 대해 이보다 앞에 괄호('datetime('now'))를 추가해야 합니다.local time same 쿼리에 대한 datetime('now', 'local time')을 선택합니다.

(datetime("지금", "로컬 시간")

밀리초의 정밀도를 원한다면 다음을 시도해 보십시오.

CREATE TABLE my_table (
    timestamp DATETIME DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

이렇게 하면 타임스탬프가 텍스트로 저장됩니다.

이 대체 예제에서는 로컬 시간을 정수로 저장하여 20바이트를 저장합니다.작업은 기본값, Update-trigger 및 View 필드에서 수행됩니다. %s(이중 따옴표)가 '불연속' 오류를 발생시켰기 때문에 strftime은 '%s'(단일 따옴표)를 사용해야 합니다.

Create Table Demo (
   idDemo    Integer    Not Null Primary Key AutoIncrement
  ,DemoValue Text       Not Null Unique
  ,DatTimIns Integer(4) Not Null Default (strftime('%s', DateTime('Now', 'localtime'))) -- get Now/UTC, convert to local, convert to string/Unix Time, store as Integer(4)
  ,DatTimUpd Integer(4)     Null
);

Create Trigger trgDemoUpd After Update On Demo Begin
  Update Demo Set
    DatTimUpd  =                          strftime('%s', DateTime('Now', 'localtime'))  -- same as DatTimIns
  Where idDemo = new.idDemo;
End;

Create View If Not Exists vewDemo As Select -- convert Unix-Times to DateTimes so not every single query needs to do so
   idDemo
  ,DemoValue
  ,DateTime(DatTimIns, 'unixepoch') As DatTimIns -- convert Integer(4) (treating it as Unix-Time)
  ,DateTime(DatTimUpd, 'unixepoch') As DatTimUpd --   to YYYY-MM-DD HH:MM:SS
From Demo;

Insert Into Demo (DemoValue) Values ('One');                      -- activate the field Default
-- WAIT a few seconds --    
Insert Into Demo (DemoValue) Values ('Two');                      -- same thing but with
Insert Into Demo (DemoValue) Values ('Thr');                      --   later time values

Update Demo Set DemoValue = DemoValue || ' Upd' Where idDemo = 1; -- activate the Update-trigger

Select * From    Demo;                                            -- display raw audit values
idDemo  DemoValue  DatTimIns   DatTimUpd
------  ---------  ----------  ----------
1       One Upd    1560024902  1560024944
2       Two        1560024944
3       Thr        1560024944

Select * From vewDemo;                                            -- display automatic audit values
idDemo  DemoValue  DatTimIns            DatTimUpd
------  ---------  -------------------  -------------------
1       One Upd    2019-06-08 20:15:02  2019-06-08 20:15:44
2       Two        2019-06-08 20:15:44
3       Thr        2019-06-08 20:15:44

언급URL : https://stackoverflow.com/questions/200309/how-to-create-timestamp-column-with-default-value-now

반응형