使用SQLite的日期时间和.NET

时间:2011-11-11 20:55:10

标签: c# sql sqlite datetime time

我有一张桌子:

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。

1 个答案:

答案 0 :(得分:4)

  

这是一个错误吗?

不确定,但如果没有达到您的目标,我会更加惊讶:

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

对我来说,你所经历的行为是有道理的。

我不认为TIMESTAMP列会有关于时间是否符合UTC的任何信息,我当然不希望它默认强制使用UTC。

这也会带来更好的性能,因为时区转换(相对)昂贵,而自动转换将是一种隐藏机制。