【发布时间】:2021-10-08 16:21:25
【问题描述】:
我想在 SQLite DB(使用 C#)中创建一个字段来存储所用时间(持续时间)字段。该值将采用hr:min:sec 格式,例如'10:10:00',表示10 小时、10 分钟和00 秒。我应该为此使用哪种数据类型?我知道DateTime 不够用,因为它用于存储日期时间。
【问题讨论】:
-
您应该在问题中添加 C# 标签。
我想在 SQLite DB(使用 C#)中创建一个字段来存储所用时间(持续时间)字段。该值将采用hr:min:sec 格式,例如'10:10:00',表示10 小时、10 分钟和00 秒。我应该为此使用哪种数据类型?我知道DateTime 不够用,因为它用于存储日期时间。
【问题讨论】:
在 C# 中使用 TimeSpan。这意味着表示经过的持续时间,这就是您所描述的。
在 SQLite 中,您应该存储一个 INTEGER 类型,以便您的数据是可排序的。你只需要决定你需要什么粒度。
例如,如果您关心尽可能精确的绝对精度,您可以存储TimeSpan.Ticks。为此,您需要一个 8 个字节的 INTEGER。加载时可以使用TimeSpan.FromTicks,也可以使用构造函数new TimeSpan(ticks)。
更有可能的是,您会想要存储整数秒,您可以从TimeSpan.TotalSeconds 获得。您可以为此使用 4 个字节的 INTEGER。加载时,您可以使用 TimeSpan.FromSeconds 从整数重新创建时间跨度。
【讨论】:
DateTime 或 TimeSpan 绰绰有余,但 SQLite 不支持它们。
在 SQLite 中,可能的数据类型有 TEXT、INTEGER、REAL 和 BLOB(分别相当于 .NET 的 String、Int64、Double 和 Byte 数组)。
您所要做的就是将您的 C# DateTime 或 TimeSpan 操作为您喜欢的 SQLite 数据类型。
【讨论】:
DateTime 转换为字符串、整数或实数,具体取决于连接字符串中指定的DateTimeFormat。不幸的是,它根本无法处理TimeSpan。
我认为@Matt Johnson 的答案是最合适的,但是,我提出了另一种方法。就我而言,问题有点不同。我必须存储餐厅的预订信息,其中包括以下两个字段:
日期时间开始日期时间
时间跨度持续时间
由于您无法在 Sqlite 中存储 TimeSpan,因此我创建了一个 DateTime 类型的列名 EndDateTime。所以 Duration 就是 EndDateTime 和 StartDateTime 的区别,像这样:
StartDateTime = reader.GetDateTime(5);
Duration = reader.GetDateTime(6).Subtract(StartDateTime);
【讨论】: