具体来说,我只需要几小时:分钟,但我说我有一个.NET TimeSpan对象,我应该如何将它存储在SQL(CE)数据库中?
答案 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分钟区分开来,我会将列命名为minutes
或absminutes
(绝对分钟)。
要将数据库值转换为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"];