Datetimes and .NET with SQLite
我有一张桌子:
1 2 3 4 | CREATE TABLE [Lines] ( [Value] TEXT NOT NULL, [AddedOn] TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL ) |
如您所见,AddedOn列是一个时间戳,如果在插入时未提供,则设置为记录当前日期时间。
请考虑以下c#代码:
1 2 3 4 5 6 | using (var cmd = conn.CreateCommand()) { cmd.CommandText ="INSERT INTO Lines(Value) VALUES (@Value)"; cmd.Parameters.AddWithValue("@Value", objectValue); cmd.ExecuteNonQuery(); } |
请注意,上面我让SQLite分配日期。 现在,相同的代码,除了我传递AddedOn值(例如DateTime.Now - 现在)
1 2 3 4 5 6 7 8 | 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。
Is it a bug?
不确定,但如果这没有达到你的目标,我会更惊讶:
1 | cmd.Parameters.AddWithValue("@AddedOn", DateTime.UtcNow); |
对我来说,你所经历的行为是有道理的。
我不认为
这也将提供更好的性能,因为时区转换(相对)昂贵,并且自动转换将是隐藏机制。