Datetimes and .NET with SQLite

本文关键字:SQLite with NET and Datetimes | 更新日期: 2023-09-27 18:14:08

我有一个表:

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

可以看到,adddon列是一个时间戳,如果在插入时没有提供,则将其设置为记录当前日期时间。

请考虑以下c#代码:

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

注意,上面我让SQLite分配日期。现在,相同的代码,除了我传递adddon值(例如DateTime)。现在-现在)

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();
}

如果我比较这两个插入的结果,我发现当我让adddon默认值生效时(第一个示例),它将当前日期时间保存为GMT。当我显式地传递日期(第二个例子)时,它保存了我所在时区的实际当前日期时间。

这是故意的吗?是bug吗?看起来行为应该是一致的,我传入的日期时间应该转换为GMT。

Datetimes and .NET with SQLite

是bug吗?

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

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

对我来说,你所经历的行为是有意义的。

我不认为TIMESTAMP列会有任何关于时间是否应该是UTC的信息,我当然也不希望它在默认情况下强制使用UTC。

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