【问题标题】:Datetimes and .NET with SQLite日期时间和带有 SQLite 的 .NET
【发布时间】:2011-12-27 08:13:37
【问题描述】:

我有一张桌子:

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 分配日期。现在,相同的代码,除了我传递了 AdditionalOn 值(例如 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();
}

如果我然后比较这 2 个插入的结果,我发现当我让 AdditionalOn 默认启动时(第一个示例),它保存了 GMT 的当前日期时间。当我明确传递日期(第二个示例)时,它会将实际的当前日期时间保存在我的时区中。

这是设计使然吗?它是一个错误吗?看来行为应该是一致的,并且我传入的日期时间应该转换为 GMT。

【问题讨论】:

    标签: c# sql sqlite datetime time


    【解决方案1】:

    这是一个错误吗?

    不确定,但如果 没有实现您的目标,我会更惊讶:

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

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

    我不认为TIMESTAMP 列会有任何关于时间是否预计为 UTC 的信息,而且我当然不希望它默认强制 UTC。

    这也将提高性能,因为时区转换(相对)昂贵,并且自动转换将是一种隐藏机制。

    【讨论】:

    • 我不同意 perf,因为当我检索数据时,我仍然必须将其转换为本地日期时间。
    • @AngryHacker:如果您以一种格式存储并以另一种格式检索,则必须进行转换,因此性能命中是不可避免的。但是,数据库不会强制对您进行性能打击,因此您不必进行两次转换。这意味着您可以随意存储当地时间。
    • @AngryHacker:你的问题会变成:“我如何让 SqLite 在当地时间存储CURRENT_TIMESTAMP”?如果是这样,请参阅这个问题:stackoverflow.com/questions/381371/… - 这里有两组建议:1:始终使用 UTC,并且只在演示文稿时进行转换(我个人的建议)2:使用 CURRENT_TIMESTAMP 以外的机制(我不'不推荐这个,因为你将来会把自己画到一个角落里。当 TZ 和 DST 在中间发挥作用时,数学会变得更加困难和昂贵)。
    • 我最终只是每次都手动传递AddedOn。它更简单,因为它存储当前时间的值,并且在任何地方都没有任何转换。
    猜你喜欢
    • 1970-01-01
    • 2020-03-24
    • 2019-07-14
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多