首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将TimeSpan值以"d.hh:mm:ss“格式保存在数据库中?

如何将TimeSpan值以"d.hh:mm:ss“格式保存在数据库中?
EN

Stack Overflow用户
提问于 2016-02-19 06:03:03
回答 3查看 8K关注 0票数 1
代码语言:javascript
运行
复制
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之间。“

请帮我解决这个问题。

EN

回答 3

Stack Overflow用户

发布于 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位。如下所示:

代码语言:javascript
运行
复制
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字节):

代码语言:javascript
运行
复制
TimeSpan tick value (64-bits): 0x01 0x23 0x45 0x67 0x89 0x00 0x00 0x00

保留:

代码语言:javascript
运行
复制
TimeSpan tooBig = new TimeSpoan( 2, 8, 8, 8 );
Int64 tooBigBits = tooBig.Ticks;
Int64 truncated = tooBigBits >> 24;
TimeSpan temp = TimeSpan.FromTicks ( truncated );

yourDbEntity.timeValue = temp;

装货:

代码语言:javascript
运行
复制
TimeSpan temp = yourDbEntity.timeValue;
Int64 truncated = temp.Ticks;
Int64 adjusted = truncated << 24;
TimeSpan actual = TimeSpan.FromTicks( adjusted );

yourDbEntity.timeValue = actual;
票数 3
EN

Stack Overflow用户

发布于 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)

票数 2
EN

Stack Overflow用户

发布于 2016-02-19 07:03:52

您可以将时间作为DateTime (02.01.0001 08:08: 08:08:08)存储在db中,并且仍然将时间用于项目

代码语言:javascript
运行
复制
public class Task
{
    [NotMapped] 
    public TimeSpan Duration
    {
        get { return Duration2 - DateTime.MinValue; }
        set { Duration2 = DateTime.MinValue + value; }
    }

    public DateTime Duration2 { get; set; }
}

这有一个缺点,即不能基于Duration进行数据库查询

代码语言:javascript
运行
复制
var tasks = from t in tasks where t.Duration > TimeSpan.FromHours(50);

但你得用

代码语言:javascript
运行
复制
var duration = DateTime.MinValue + TimeSpan.FromHours(50);
var tasks = from t in tasks where t.Duration2 > duration;

或者,您可以使用相同的概念在数据库中存储秒而不是日期值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35498363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档