Sql server ce 在SQLServerCE中表示时间跨度的最佳方法是什么?

Sql server ce 在SQLServerCE中表示时间跨度的最佳方法是什么?,sql-server-ce,timespan,Sql Server Ce,Timespan,具体来说,我只需要小时:分钟,但假设我有一个.NET TimeSpan对象,我应该如何将其存储在SQL(CE)数据库中?SQL CE没有时间类型或用户定义的类型,因此您可以选择datetime或表示分钟的int。如果需要存储的最大时间是23:59=23*60+59=1439=从0分钟开始的一天中的分钟数,则smallint是适应该范围的最小整数类型 抵制诱惑,将小时和分钟存储在单独的列中,作为罐头。这将使用与单个smallint相同的空间,但是每次计算时间都需要将小时乘以60并加上分钟,并且每个

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

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

抵制诱惑,将小时和分钟存储在单独的列中,作为罐头。这将使用与单个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对象,请像这样使用ctor
Timespan(int,int,int)
新建Timespan(floor(absminutes/60),absminutes%60,0)或(更好)将ctor
Timespan(long)
新建Timespan(absminutes*Timespan.tickserMinute)
一起使用


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

,我建议使用long来表示时间的数量。这就是它的内部表示。这使您可以使用该方法轻松地重新构建对象,并使用输出到数据库。NET中最小的时间单位是滴答声,等于100纳秒

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

TimeSpanObj = TimeSpan.Parse(fieldValue)

我目前正在考虑使用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


这正是我正在做的项目。然后ORM层会像您所说的那样在TimeSpan和ticks之间来回进行转换,不会出现任何错误。另外,一个额外的好处是,你已经获得了所有可能需要的精度。如果你坚持以分钟为单位,你就会遇到一个真正的问题,如果你的营销部门说“将精度降低到秒有多难?”很好,但是一个滴答声可以保证精确到100纳秒吗?框架文档没有提到任何回旋余地:为什么会被否决?这是一个合理的建议,如果您必须直接编辑SQL数据,那么将“2分钟”写成
'00:02'
1200000000
容易得多
SqlDataReader dr = cmd.ExecuteReader();
DelayTime = (TimeSpan) dr["DelayTime"];