admin

使用SQLite的日期时间和.NET

sql

我有一张表:

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。


阅读 190

收藏
2021-07-01

共1个答案

admin

是虫子吗?

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

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

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

我不会想像一TIMESTAMP列会包含有关是否期望某个时间使用UTC的任何信息,并且我当然也不会期望它默认情况下强制使用UTC。

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

2021-07-01