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