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。
我不同意perf的原因,因爲當我檢索數據時,我仍然必須將其轉換爲本地日期時間。 – AngryHacker
@AngryHacker:如果您以一種格式存儲並以另一種格式進行檢索,則必須進行轉換,所以perf的命中是不可避免的。但是數據庫不會*強制*擊中你,所以你不必進行兩次轉換。這意味着如果您願意,您可以自由存儲當地時間。 –
@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在中間發揮作用時,更難和更昂貴)。 –