2011-11-11 47 views
1

我有一個表:日期時間和.NET使用SQLite

CREATE TABLE [Lines] (
[Value] TEXT NOT NULL, 
[AddedOn] TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL 
) 

正如你所看到的,AddedOn列是一個時間戳,並設置爲記錄當前日期時間,如果在插入時未提供一個。

請考慮下面的C#代碼:

using (var cmd = conn.CreateCommand())  
{ 
    cmd.CommandText = "INSERT INTO Lines(Value) VALUES (@Value)"; 
    cmd.Parameters.AddWithValue("@Value", objectValue); 
    cmd.ExecuteNonQuery(); 
}  

注意上面,我是讓SQLite的指定日期。現在,同樣的代碼,但我經過AddedOn值(例如DateTime.Now - 現在)

using (var cmd = conn.CreateCommand())  
{ 
    cmd.CommandText = "INSERT INTO Lines(Value, AddedOn) VALUES (@Value, @AddedOn)"; 
    cmd.Parameters.AddWithValue("@Value", objectValue); 
    cmd.Parameters.AddWithValue("@AddedOn", DateTime.Now); 

    cmd.ExecuteNonQuery(); 
} 

如果我再比較這兩個插入的結果,我發現,當我讓AddedOn默認踢在第一個例子中,它將當前的日期時間保存在GMT。當我明確傳遞日期(第二個示例)時,它將當前的實際日期時間保存在我的時區中。

這是設計嗎?這是一個錯誤嗎?這似乎是行爲應該是一致的,我通過的日期時間應該轉換爲GMT。

回答

4

這是一個錯誤嗎?

不知道,但我會更感到驚訝,如果這沒有實現自己的目標:

cmd.Parameters.AddWithValue("@AddedOn", DateTime.UtcNow); 

對我來說,您遇到的行爲很有道理。

我不會想象TIMESTAMP列會有關於時間是否應該是UTC的信息,我當然也不會指望它默認強制UTC。

由於時區轉換(相對)昂貴,並且自動轉換將成爲隱藏機制,這也會使perf更好。

+0

我不同意perf的原因,因爲當我檢索數據時,我仍然必須將其轉換爲本地日期時間。 – AngryHacker

+0

@AngryHacker:如果您以一種格式存儲並以另一種格式進行檢索,則必須進行轉換,所以perf的命中是不可避免的。但是數據庫不會*強制*擊中你,所以你不必進行兩次轉換。這意味着如果您願意,您可以自由存儲當地時間。 –

+1

@AngryHacker:你的問題會變成:「我如何讓SqLite在當地時間存儲'CURRENT_TIMESTAMP'」?如果是這樣,看到這個問題:http://stackoverflow.com/questions/381371/sqlite-current-timestamp-is-in-gmt-not-the-timezone-of-the-machine - 這裏有兩套建議:1:始終使用UTC,並且只對演示文稿進行轉換(我個人建議)2:使用除「CURRENT_TIMESTAMP」之外的機制(我不建議這樣做,因爲您將來將自己繪製到角落中。當TZ和DST在中間發揮作用時,更難和更昂貴)。 –