2008-10-14 5 views
142

이 타임 스탬프 열이있는 테이블을 craete하는 SQLite는 데이터베이스에서 가능하다 DATETIME('now')에 기본? 이처럼SQLite는 데이터베이스 기본 시간 값 '지금'

:

이 오류를 제공
CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP DEFAULT DATETIME('now') 
); 

... 어떻게 해결하려면?

답변

222

난 당신이 버전 3.1 박사에 따라 (source)

+13

는,이 요리법은 날짜마다 데이터베이스에 약 24 바이트를 차지, ISO-8601 (텍스트 형식)에 타임 스탬프를 절약 할 수 있습니다.INTEGER (4) 열을 사용하고 INSERT INTO test (t) 값 (strftime ("% s", CURRENT_TIME))을 통해 유닉스 시간을 저장하여 공간을 절약 할 수 있습니다. – mckoss

+2

@mckoss 귀하의 의견에 감사드립니다. 작성 진술은 다음과 같습니다 : ... mycolumn default (strftime ('% s', 'now')) – larham1

+1

"... 기본값 (strftime ('% s', 'now')) "상수 표현식이 아니며 기본적으로"Error : column [...]의 기본값이 상수가 아닙니다. "라는 경고를 표시합니다. –

71

의로

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

를 사용할 수 있다고 생각합니다. 최근 목록 게시물에 HIPP :

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

감사합니다. UTC보다는 현지 시간이있는 기본 타임 스탬프 – hoju

+0

Metoo, localtime 매개 변수에 대한 감사합니다. – pihentagy

+0

정말 고마워요! 나는'CURRENT_TIMESTAMP' 형식에 만족하지 않았기 때문에 C에서 자체 함수를 만들어서 Epoch 이후 마이크로 초의 수를 반환했습니다. 이제 저는 이것을 'DEFAULT'로 사용할 수있어서 기쁩니다. – Michael

31

그것은, 당신은 괄호가 필요 단지 구문 오류 : 당신이 documentation 보면 (DATETIME('now'))

, 당신이 'expr에'주위에 추가 괄호를 알게 될 것이다을 옵션을 사용하십시오. 당신이

Select datetime('now') then it will give you utc time but if you this write it query then you must add parenthesis before this so (datetime('now')) for UTC Time. for local time same Select datetime('now','localtime') for query

작성하는 경우는 괄호에게

를 작성하지 않았기 때문에

3

그것은 구문 오류입니다 (날짜를 ('지금', '의 현지'))

3

사용하는 것이 더 좋을 수 있습니다 REAL 유형으로 저장 공간을 절약합니다.

견적

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

SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values

Datatypes In SQLite Version 3 섹션 1.2를 참조 column-constraint.

그리고 insert 어떤 가치를 제공하지 않고 행.

INSERT INTO "test" DEFAULT VALUES; 
+0

나는'n'에 적합한 값을 선택할 수있는'integer (n)'을 선호합니다. – user272735

9

이것은 다른 답변과 질문에 대한 전체적인 예입니다. 이 예에서 시간 소인 (created_at -column)은 unix epoch UTC 시간대로 저장되고 필요한 경우에만 현지 시간대로 변환됩니다. 24 바이트 문자열 대 4 바이트 정수 ISO8601 문자열로 저장 될 때, datatypes를 참조 - 유닉스 시대를 사용

저장 공간을 절약 할 수 있습니다. 4 바이트가 충분하지 않으면 6 또는 8 바이트로 증가시킬 수 있습니다. UTC 시간대에

저장 타임 스탬프는 편리 여러 시간대에 적당한 값을 표시 할 수 있습니다.

SQLite는 버전은 우분투 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에 위치하므로 정확합니다. 당신이 저장 크기 염려되는 경우