2016-01-06 33 views
1

我不得不做一些工作,我正在與之交互並創建由SQLite.net庫操縱的表格。我需要能夠創建表,其他程序不會知道它沒有創建它自己。什麼是SQLite中的datetime-type列?

雖然看了一些模式,並感覺它是如何創造的東西,我注意到一些奇怪的東西。當我讀到SQLite's data types時,發現它是一個小列表,最初它看起來像是我想存儲日期/時間,我需要確保在SELECT/INSERT/UPDATE查詢中使用特殊函數,而列可以是TEXT或INTEGER或REAL。如果我在某處忘記了datetime()函數,我希望得到的東西不是我想要的東西(除了可能是TEXT列)。

因此,我正在查看其中一個表的模式,我在列中看到:

"LastUpdated" datetime , 

呃,好的。 'datetime'不是一種類型。或者是? '類型親和性'規則表明'datetime'是一個有效的類型說明符,將被視爲NUMERIC。好吧,那裏沒有任何東西。我試着查詢:

sqlite> select datetime(LastUpdated) from Foo; 
2016-01-06 15:37:36 

這很有道理。我敢打賭,如果我忘記了datetime()函數,我會得到一些愚蠢的東西,對吧?

sqlite> select datetime(LastUpdated) from DestinationAdapter; 
2016-01-06 15:37:36 

呃......好的。如果它是一個TEXT列,我想這是有道理的。所以我做了一個測試表:

sqlite> CREATE TABLE TestDateTime ( 
    ...> "Id" integer primary key autoincrement not null, 
    ...> "Value" TEXT, 
    ...> "ValueN" NUMERIC); 
sqlite> INSERT INTO TestDateTime(Value, ValueN) VALUES (datetime('2015-01-06 10:20:30'), datetime('2015-01-06 10:20:30')); 
sqlite> select * from TestDateTime; 
1|2015-01-06 10:20:30|2015-01-06 10:20:30 

好的。這很奇怪。看起來SQLite存儲的東西不是數據類型文檔中討論的值。無論它是什麼,它都會告訴SQLite的控制檯工具,該列中的值是日期/時間值,應該按照這樣的方式呈現。那麼究竟發生了什麼?看起來無論我分配給列的日期和時間是「正常工作」。這太神奇了,讓我感到舒服。這裏發生了什麼,以及它如何影響我如何編寫涉及日期/時間值的查詢?

回答

3

因爲您試圖將文本存儲到NUMERIC字段中,所以它只是將其存儲爲文本。它不存儲日期時間價值,也不知道它的存儲日期時間,它只是存儲由datetime()功能

返回從你鏈接的文檔字符串:(重點煤礦)

2.0類型親和力

爲了最大限度地提高SQLite和其他數據庫引擎之間的兼容性,SQLite支持列上的「type affinity」概念。 列中的類型親和性是該列中存儲的數據 的推薦類型。 這裏的重要想法是推薦使用 ,不是必需的。 任何列都可以存儲任何類型的 數據。只是有些列在給出選擇的情況下會更願意使用 來使用一個存儲類而不是另一個。 列的首選存儲類稱爲其「親和性」。

具有NUMERIC關聯性的列可能包含使用全部五個存儲類的值。將文本數據插入NUMERIC列 時,如果此類轉換是無損和可逆的,則文本的存儲類將轉換爲INTEGER或REAL(以 的優先順序)。 對於TEXT和REAL存儲類之間的轉換,SQLite 認爲轉換是無損和可逆的,如果保留數字的前15位數。 如果無法將TEXT無損轉換爲INTEGER或REAL,則 值將使用TEXT存儲類存儲。沒有嘗試將 轉換爲NULL或BLOB值。

+0

好吧,這是有道理的,除了它讓我問這個問題,「那麼datetime()函數究竟是什麼,難道我不能僅僅在列中敲擊字符串? – OwenP

+0

哦。等待。是這樣的答案:「你不在INSERT查詢中使用datetime()」? – OwenP

+1

@OwenP'datetime()'是格式化函數,不是轉換函數。所以當你想將你傳遞的任何值轉換成日期和時間的特定字符串表示時,你可以使用它。 –