2013-08-22 100 views
4

表:SQLite的允許字符串數據插入到datetime列

CREATE TABLE logaction 
(
    actype varchar(8) not null, 
    actime DATETIME not null, 
    devid int not null 
); 

SQL:

insert into logaction values ('TEST', '2013-08-22', 1); 
insert into logaction values ('TEST', '2013-08-22 09:45:30', 1); 
insert into logaction values ('TEST', 'xyz', 2); // shouldn't this fail? 

的最後一條記錄並使其成爲該表無論非datetime值的actime列。爲什麼以及如何強制只有好的數據進入?

這是SQL Fiddle

回答

7

嗯,只是SQLite中沒有DATETIME類型...

SQLite不有一個存儲類別用於存儲日期 和/或時間。取而代之的是,SQLite的 的內置日期和時間函數能夠存儲日期和時間爲TEXT,REAL或INTEGER 值:

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS"). 
REAL as Julian day numbers, the number of days since noon in Greenwich 
on November 24, 4714 B.C. according to the proleptic Gregorian calendar. 
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC. 

應用程序可以選擇存儲日期和時間在這些 的格式和使用內置日期和 時間函數自由轉換格式。

看到doc

你可以創建你的表像,它不會改變任何東西。

CREATE TABLE logaction 
(
    actype varchar(8) not null, 
    actime NonexistingType not null, 
    devid int not null 
); 
+0

你知道了'INTEGER'多少位支持?例如我能從1970年1月1日開始放置幾毫秒嗎?我需要精確的時間戳 – amphibient

+2

你看過http://www.sqlite.org/lang_datefunc.html嗎? –

+0

我剛剛測試了1377181566303,它工作,所以它都很好。 – amphibient

3

不幸的是,沒有真正SQLite中 - 它沒有一個日期時間類型 - 見1.2 here

3

這裏有一個簡單的解決辦法:

CREATE TABLE logaction 
(
    actype varchar(8) not null, 
    actime DATETIME not null check(DATETIME(actime) is not null), 
    devid int not null 
); 

sqlite> insert into logaction values ('TEST', '2013-08-22', 1); 
sqlite> insert into logaction values ('TEST', '2013-08-22 09:45:30', 1); 
sqlite> insert into logaction values ('TEST', 'xyz', 2); 
Error: constraint failed 
sqlite> 
+0

是的,但這將使我能夠查詢和比較'actime'列作爲時間而不是字符串? – amphibient

+0

@amphibient你將不得不使用日期和時間函數(http://www.sqlite.org/lang_datefunc.html)進行任何日期/時間比較 –

+0

我只是要''整數',謝謝 – amphibient