sqlite 데이터베이스 기본 시간 값 '지금'


190

sqlite 데이터베이스에서 기본 타임 스탬프 열이있는 테이블을 복사 할 수 DATETIME('now')있습니까?

이처럼 :

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

오류가 발생했습니다 ... 해결 방법?

답변:


291

나는 당신이 사용할 수 있다고 생각

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

버전 3.1 기준 ( source )


22
저장 영역 크기가 염려되는 경우이 레시피는 데이터베이스에서 날짜 당 약 24 바이트를 차지하여 시간 소인을 ISO-8601 (텍스트 형식)로 저장합니다. INTEGER (4) 열을 사용하고 "INSERT INTO test (t) 값 (strftime ("% s ", CURRENT_TIME));"을 통해 유닉스 시간을 저장하면 공간을 절약 할 수 있습니다.
mckoss 2012

3
@mckoss 귀하의 의견 덕분에 create 문은 다음과 같습니다. ... mycolumn default (strftime ( '% s', 'now'))
larham1 2018 년

1
"... default (strftime ( '% s', 'now'))"는 상수 표현식이 아니며 "오류 : 열 [...]의 기본값이 일정하지 않습니다"를 제공하는 기본값으로 작동하지 않습니다.
Mirek Rusin

@mckoss는 좋지만 SQLite는 "INTEGER"다음의 "(4)"를 무시합니다. SQLite 문서 : 데이터 유형 SQLite 버전 3에서 "유형 이름 뒤에 오는 괄호 안의 숫자 인수는 SQLite에서 무시됩니다"라고 말하고 "INTEGER"스토리지 클래스의 값을 저장하는 데 사용되는 바이트 수는 "크기에 따라 다릅니다" "의 가치. 따라서 SQLite가 단 4 바이트로 저장하는 것이 옳다고 생각하지만 2038 년까지는 6 바이트를 사용해야합니다. 컴퓨터는 그때까지 코드를 작성할 수 있으며 4461642 년에는 8 바이트를 사용해야합니다.
ma11hew28

94

박사에 따르면 최근 목록 게시물의 hipp :

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

정말 고맙습니다! 나는 형식에 만족하지 않았기 CURRENT_TIMESTAMP때문에 Epoch 이후 마이크로 초 수를 반환하기 위해 C에서 자체 함수를 만들었으며 DEFAULT지금 사용할 수있어서 기쁩니다 .
Michael

39

구문 오류 일 뿐이므로 괄호가 필요합니다. (DATETIME('now'))

documentation 을 보면 구문에서 'expr'옵션 주위에 추가 된 괄호에 유의하십시오.


18

이것은 다른 답변과 질문에 대한 의견을 바탕으로 한 완전한 예입니다. 이 예에서 타임 스탬프 ( created_at-column)는 유닉스 시대 UTC 시간대 로 저장되고 필요한 경우에만 현지 시간대로 변환됩니다.

유닉스 시대를 사용하면 ISO8601 문자열로 저장 될 때 저장 공간-4 바이트 정수 대 24 바이트 문자열이 절약됩니다 ( 데이터 유형 참조) . 4 바이트가 충분하지 않으면 6 또는 8 바이트로 늘릴 수 있습니다.

UTC 시간대로 타임 스탬프를 저장하면 여러 시간대에서 합리적인 값을 표시하는 것이 편리합니다.

SQLite 버전은 3.8.6이며 Ubuntu LTS 14.04와 함께 제공됩니다.

$ 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에 있으므로 현지 시간이 정확합니다.


7

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

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

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

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

column-constraint를 참조하십시오 .

그리고 값을 제공하지 않고 행을 삽입 하십시오.

INSERT INTO "test" DEFAULT VALUES;

1
integer(n)적절한 값을 선택할 수있는 곳을 선호 합니다 n.
user272735

4

괄호를 쓰지 않았기 때문에 구문 오류입니다

당신이 쓰는 경우

datetime ( 'now')을 선택하면 utc 시간이 주어 지지만이 쿼리를 작성하면 UTC 시간에 대해 괄호를 추가해야합니다 (datetime ( 'now')). 현지 시간 동일 검색어에 대해 datetime ( 'now', 'localtime')을 선택하십시오.

(datetime ( '지금', 'localtime'))


1

이 대체 예제는 현지 시간을 정수로 저장하여 20 바이트를 저장합니다. 작업은 필드 기본값, 업데이트 트리거 및보기에서 수행됩니다. "% s"(큰 따옴표)가 'Not Constant'오류를 발생 시켰으므로 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.