在SQL Server CE中表示时间跨度的最佳方法是什么?

时间:2009-04-05 04:21:17

标签: sql-server-ce timespan

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

4 个答案:

答案 0 :(得分:38)

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

答案 1 :(得分:1)

SQL CE没有时间类型或用户定义的类型,因此您的选择是datetime或表示分钟的int。如果您需要存储的最长时间是23:59 = 23 * 60 + 59 = 1439 =从第0分钟开始的一天中的分钟数,则smallint是适应该范围的最小整数类型。

抵制将小时和分钟存储在单独列中的诱惑,作为tinyints。这将使用相同的空间作为单个smallint,但是每次计算时间都需要将小时乘以60并添加分钟,并且每order by将需要两列而不是一列。

以分钟为单位存储;在显示屏上,您可以使用

将分钟分为小时和分钟
select floor( absminutes / 60 ) as hours, absminutes % 60 as minutes,
from some table
order by absminutes; 

如果要将一天中的1439分钟与一小时内的0-59分钟区分开来,我会将列命名为minutesabsminutes(绝对分钟)​​。

要将数据库值转换为Timespan对象,请使用ctor Timespan(int, int, int),例如new TimeSpan( floor(absminutes / 60 ), absminutes % 60, 0)或(更好)ctor Timespan(long) new Timespan( absminutes * TimeSpan.TicksPerMinute )

要从Timespan对象插入或更新数据库,请将absminutes设置为someTimespan.TotalMinutes % 1440

答案 2 :(得分:1)

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

TimeSpanObj = TimeSpan.Parse(fieldValue)

答案 3 :(得分: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"];