如何在SQL中忽略TimeSpan天数部分存入Time(7)列
解决TimeSpan存入SQL Server Time(7)列的溢出问题
这个问题我之前也碰到过,SQL Server的Time(7)类型只支持存储00:00:00.0000000到23:59:59.9999999范围内的时间,当你的TimeSpan包含1天及以上的天数部分时,自然就会触发溢出错误。要忽略天数部分,只保留当天内的时分秒信息,有几个简单实用的方法:
方法一:用总小时数取模24
通过TotalHours获取TimeSpan的总小时数,对24取模后再转成新的TimeSpan,这样不管原TimeSpan有多少天,都会自动转换成当天内的时间:
// 示例:原TimeSpan为1天0小时 TimeSpan originalTs = TimeSpan.FromDays(1); // 调整后得到00:00:00 TimeSpan adjustedTs = TimeSpan.FromHours(originalTs.TotalHours % 24);
比如原TimeSpan是3天2小时15分,调整后就会得到02:15:00,完全符合Time(7)的范围。
方法二:直接减去整数天数的时间
更直观的方式是,直接用原TimeSpan减去它包含的整数天数对应的时间,剩下的就是当天内的部分:
// 示例:原TimeSpan为1天3小时45分 TimeSpan originalTs = new TimeSpan(1, 3, 45, 0); // 减去1天的时间,得到03:45:00 TimeSpan adjustedTs = originalTs.Subtract(TimeSpan.FromDays(originalTs.Days));
这种方法逻辑清晰,容易理解,适合需要明确看到“移除天数”操作的场景。
额外提示
如果你的TimeSpan是从DateTime对象转换来的,其实可以直接用DateTime.TimeOfDay属性,它本身就是一个范围在0到23:59:59之间的TimeSpan,天生就符合Time(7)的要求,不需要额外处理。
内容的提问来源于stack exchange,提问作者Abdulsalam Elsharif
相关产品推荐
相关产品推荐

