我试图在SQL server 2008 R2中存储. net TimeSpan。

EF Code First似乎建议它应该存储为SQL中的时间(7)。

然而。net中的TimeSpan可以处理超过24小时的时间。

在SQL server中存储。net TimeSpan的最佳方法是什么?


当前回答

如果你不需要存储超过24小时,你可以只存储时间,因为SQL Server 2008和以后的映射是

time (SQL Server) <-> TimeSpan(.NET)

不需要转换,如果你只需要存储24小时或更少。

来源:http://msdn.microsoft.com/en-us/library/cc716729 (v = vs.110) . aspx

但是,如果您希望存储超过24小时的时间,则需要以tick为单位存储它,检索数据,然后转换为TimeSpan。例如

int timeData = yourContext.yourTable.FirstOrDefault();
TimeSpan ts = TimeSpan.FromMilliseconds(timeData);

其他回答

我会存储时间跨度。然后使用Timespan.FromSeconds(TotalSeconds)检索它。

根据你需要的分辨率,你可以使用TotalMilliseconds, TotalMinutes, TotalDays。

您还可以在数据库中调整浮点数的精度。

这不是一个确切的值……但是这样做的好处是它很容易在简单的查询中读取和计算。

如果你不需要存储超过24小时,你可以只存储时间,因为SQL Server 2008和以后的映射是

time (SQL Server) <-> TimeSpan(.NET)

不需要转换,如果你只需要存储24小时或更少。

来源:http://msdn.microsoft.com/en-us/library/cc716729 (v = vs.110) . aspx

但是,如果您希望存储超过24小时的时间,则需要以tick为单位存储它,检索数据,然后转换为TimeSpan。例如

int timeData = yourContext.yourTable.FirstOrDefault();
TimeSpan ts = TimeSpan.FromMilliseconds(timeData);

我知道这是一个老问题,但我想确保注意到一些其他选项。

由于您不能在time sql datatype字段中存储大于24小时的TimeSpan;其他一些选择可能是。

Use a varchar(xx) to store the ToString of the TimeSpan. The benefit of this is the precision doesn't have to be baked into the datatype or the calculation, (seconds vs milliseconds vs days vs fortnights) All you need to to is use TimeSpan.Parse/TryParse. This is what I would do. Use a second date, datetime or datetimeoffset, that stores the result of first date + timespan. Reading from the db is a matter of TimeSpan x = SecondDate - FirstDate. Using this option will protect you for other non .NET data access libraries access the same data but not understanding TimeSpans; in case you have such an environment.

谢谢你的建议。因为在SQL server中没有对等的。我简单地创建了第二个字段,将TimeSpan转换为tick并将其存储在DB中。然后,我阻止存储TimeSpan

public Int64 ValidityPeriodTicks { get; set; }

[NotMapped]
public TimeSpan ValidityPeriod
{
    get { return TimeSpan.FromTicks(ValidityPeriodTicks); }
    set { ValidityPeriodTicks = value.Ticks; }
}

我将它作为BIGINT存储在数据库中,我将存储tick的数量(例如。时间间隔。蜱虫属性)。

这样,如果我想在检索时获得一个TimeSpan对象,我只需执行TimeSpan. fromticks (value),这很简单。