【问题标题】:Which datatype to use to store TimeTaken field in SQLIte?使用哪种数据类型在 SQLite 中存储 TimeTaken 字段?
【发布时间】:2021-10-08 16:21:25
【问题描述】:

我想在 SQLite DB(使用 C#)中创建一个字段来存储所用时间(持续时间)字段。该值将采用hr:min:sec 格式,例如'10:10:00',表示10 小时、10 分钟和00 秒。我应该为此使用哪种数据类型?我知道DateTime 不够用,因为它用于存储日期时间。

【问题讨论】:

  • 您应该在问题中添加 C# 标签。

标签: c# sqlite time


【解决方案1】:

在 C# 中使用 TimeSpan。这意味着表示经过的持续时间,这就是您所描述的。

在 SQLite 中,您应该存储一个 INTEGER 类型,以便您的数据是可排序的。你只需要决定你需要什么粒度。

例如,如果您关心尽可能精确的绝对精度,您可以存储TimeSpan.Ticks。为此,您需要一个 8 个字节的 INTEGER。加载时可以使用TimeSpan.FromTicks,也可以使用构造函数new TimeSpan(ticks)

更有可能的是,您会想要存储整数秒,您可以从TimeSpan.TotalSeconds 获得。您可以为此使用 4 个字节的 INTEGER。加载时,您可以使用 TimeSpan.FromSeconds 从整数重新创建时间跨度。

【讨论】:

    【解决方案2】:

    DateTimeTimeSpan 绰绰有余,但 SQLite 不支持它们。

    在 SQLite 中,可能的数据类型有 TEXTINTEGERREALBLOB(分别相当于 .NET 的 StringInt64DoubleByte 数组)。

    您所要做的就是将您的 C# DateTimeTimeSpan 操作为您喜欢的 SQLite 数据类型。

    【讨论】:

    • SQLite 可以将DateTime 转换为字符串、整数或实数,具体取决于连接字符串中指定的DateTimeFormat。不幸的是,它根本无法处理TimeSpan
    【解决方案3】:

    我认为@Matt Johnson 的答案是最合适的,但是,我提出了另一种方法。就我而言,问题有点不同。我必须存储餐厅的预订信息,其中包括以下两个字段:

    • 日期时间开始日期时间

    • 时间跨度持续时间

    由于您无法在 Sqlite 中存储 TimeSpan,因此我创建了一个 DateTime 类型的列名 EndDateTime。所以 Duration 就是 EndDateTime 和 StartDateTime 的区别,像这样:

    StartDateTime = reader.GetDateTime(5);
    Duration = reader.GetDateTime(6).Subtract(StartDateTime);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2015-08-24
      相关资源
      最近更新 更多