具体来说,我只需要 hours:minutes 但说我有一个 .NET TimeSpan 对象,我应该如何将它存储在 SQL(CE) 数据库中?
4 回答
我建议使用 long 来表示刻度数。这就是TimeSpan使用的内部表示。这使您可以使用Timespan.FromTicks()方法轻松地重构您的对象,并使用Timespan.Ticks 属性输出到数据库。.NET 中的最小时间单位是滴答声,等于 100 纳秒
存储为 varchar。保存到 sql 使用TimeSpan.ToString()
. 从 sql 读取为:
TimeSpanObj = TimeSpan.Parse(fieldValue)
SQL CE 没有时间类型或用户定义类型,因此您可以选择 datetime 或表示分钟的 int。如果您需要存储的最大时间是 23:59 = 23 * 60 + 59 = 1439 = 从第 0 分钟开始的一天中的分钟数,则 smallint 是可容纳该范围的最小整数类型。
抵制将小时和分钟作为 tinyint 存储在单独列中的诱惑。这将使用与单个 smallint 相同的空间,但是每次计算时间都需要将小时乘以 60 并加上分钟,并且每次order by
都需要两列而不是一列。
存储为分钟;在显示屏上,您可以将分钟分为小时和分钟
select floor( absminutes / 60 ) as hours, absminutes % 60 as minutes,
from some table
order by absminutes;
如果您想将一天中的 1439 分钟与一小时中的 0-59 分钟区分开来,我会命名列minutes
,或者(绝对分钟)。absminutes
要将数据库值转换为 Timespan 对象,请使用这样的 ctorTimespan(int, int, int)
或new TimeSpan( floor(absminutes / 60 ), absminutes % 60, 0)
(更好)Timespan(long)
带有new Timespan( absminutes * TimeSpan.TicksPerMinute )
.
要从 Timespan 对象插入或更新数据库,请将 absminutes 设置为someTimespan.TotalMinutes % 1440
。
我目前正在考虑使用 SQL Time 来处理这个问题,但它不会工作 >= 24 小时。
好处包括易于阅读,易于在 SQL 和代码中使用,但缺点是您只有很短的时间跨度可以玩。
declare @delay table (DelayTime Time(3))
insert into @delay values ('00:10:00.000')
select getdate() as nowtime, getdate()+DelayTime as nowPlusTen from @delay
和
SqlDataReader dr = cmd.ExecuteReader();
DelayTime = (TimeSpan) dr["DelayTime"];