27

具体来说,我只需要 hours:minutes 但说我有一个 .NET TimeSpan 对象,我应该如何将它存储在 SQL(CE) 数据库中?

4

4 回答 4

39

我建议使用 long 来表示刻度数。这就是TimeSpan使用的内部表示。这使您可以使用Timespan.FromTicks()方法轻松地重构您的对象,并使用Timespan.Ticks 属性输出到数据库。.NET 中的最小时间单位是滴答声,等于 100 纳秒

于 2009-04-13T18:39:23.723 回答
2

存储为 varchar。保存到 sql 使用TimeSpan.ToString(). 从 sql 读取为:

TimeSpanObj = TimeSpan.Parse(fieldValue)
于 2010-08-31T14:48:27.277 回答
1

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

于 2009-04-05T04:52:50.947 回答
0

我目前正在考虑使用 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"];
于 2015-04-22T16:02:21.017 回答