TimeSpan timeInDays= new TimeSpan(2,8,8,8);我想使用EF在DB中保存"timeInDays“。表列的类型为“时间”。它给了我运行时的异常,
"SqlDbType.Time溢出。值'2.08:08:08‘超出范围。必须介于00:00:00.0000000和23:59:59.9999999之间。“
请帮我解决这个问题。
发布于 2016-02-19 07:06:58
正如@Mainul所说,time类型最多有24小时。为了存储更长的时间段,我建议使用bigint (64位整数),它可以直接表示timespan值。有关更多细节,请参见下面的QA:What is the correct SQL type to store a .Net Timespan with values > 24:00:00?
如果您无法更改表模式,那么您将不得不截断数据,一种方法是在保存到DB之前(然后在加载时向左移动),通过向右转移而丢失不太重要的位,但这将是混乱的:
默认情况下,Server中的time类型是time(7) (7位十进制精度数字),它使用5个字节,参见这里的https://msdn.microsoft.com/en-us/library/bb677243.aspx -因此我们需要将timespan ("ticks")的二进制表示形式(“ticks”)向右移动3个字节(以获取5),即24位。如下所示:
TimeSpan tick value (64-bits): 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF
SQL Server time field : 0x01 0x23 0x45 0x67 0x89当TimeSpan滴答号将它们最重要的比特存储在左边时,这意味着我们将丢失的三个字节(0xAB 0xCD 0xEF)代表了我们可以承受的不值得担心的一小部分秒。当我们将数据从DB加载回来并将其左转3字节时,它将如下所示(注意丢失值的三个0x00 0x00 0x00字节):
TimeSpan tick value (64-bits): 0x01 0x23 0x45 0x67 0x89 0x00 0x00 0x00保留:
TimeSpan tooBig = new TimeSpoan( 2, 8, 8, 8 );
Int64 tooBigBits = tooBig.Ticks;
Int64 truncated = tooBigBits >> 24;
TimeSpan temp = TimeSpan.FromTicks ( truncated );
yourDbEntity.timeValue = temp;装货:
TimeSpan temp = yourDbEntity.timeValue;
Int64 truncated = temp.Ticks;
Int64 adjusted = truncated << 24;
TimeSpan actual = TimeSpan.FromTicks( adjusted );
yourDbEntity.timeValue = actual;发布于 2016-02-19 06:38:27
在T中,时间类型列定义一天的时间.时间是没有时区意识,是基于24小时的时钟.https://msdn.microsoft.com/en-us/library/bb677243.aspx
您的TimeSpan()方法返回时间,包括它大于24小时值的日值。您可以做的是,保存时间值而不是日期值.
编辑:如果要从当前TimeSpan中减去日值,则为。
new TimeSpan(timeInDays.Hours, timeInDays.Minutes, timeInDays.Seconds)
发布于 2016-02-19 07:03:52
您可以将时间作为DateTime (02.01.0001 08:08: 08:08:08)存储在db中,并且仍然将时间用于项目
public class Task
{
[NotMapped]
public TimeSpan Duration
{
get { return Duration2 - DateTime.MinValue; }
set { Duration2 = DateTime.MinValue + value; }
}
public DateTime Duration2 { get; set; }
}这有一个缺点,即不能基于Duration进行数据库查询
var tasks = from t in tasks where t.Duration > TimeSpan.FromHours(50);但你得用
var duration = DateTime.MinValue + TimeSpan.FromHours(50);
var tasks = from t in tasks where t.Duration2 > duration;或者,您可以使用相同的概念在数据库中存储秒而不是日期值。
https://stackoverflow.com/questions/35498363
复制相似问题