当我在数据库中存储具有值DateTime.MaxValue的date属性并将其检索回来时,存储的值不等于DateTime.MaxValue。刻度属性已关闭。为什么是这样?
使用MS SQL,日期字段的数据类型为“datetime”
答案 0 :(得分:24)
因为SQL datetime的分辨率较低。
MS SQL中的DateTime数据类型 表示来自的日期和时间数据 1753年1月1日至9999年12月31日, 准确度为1 第三百秒,或3.33 毫秒。值四舍五入为 .000,.003或.007的增量 毫秒。
.Net中的DateTime值类型 表示日期和时间 0001年1月1日午夜12:00:00 Anno Domini(共同时代)通过 公元9999年12月31日晚上11:59:59 (C.E.)时间值以 100纳秒单位称为蜱虫。
答案 1 :(得分:3)
很可能是因为.NET DateTime没有直接转换为SQL DateTime类型。
我会设置值,然后检查SqlDateTime.MaxValue
的刻度。
答案 2 :(得分:1)
我必须承认我对此不确定,但这可能与日期时间的准确性有关吗?
在这里快速搜索一篇文章 Precision and accuracy of DateTime
也许c#与sql的日期时间精度之间可能存在错误?
答案 3 :(得分:0)
您存储此值的数据字段的类型是什么类型?
可能是.NET DateTime
的最大值超过了数据库引擎中等效数据类型的容量。
答案 4 :(得分:0)
MS SQL Server在最低级别的日期执行一些奇怪的事情。例如,请考虑以下脚本:
select
test1 = dateadd(ms,-1,convert(datetime,'20110504')),
test2 = dateadd(ms,-2,convert(datetime,'20110504')),
test3 = dateadd(ms,-3,convert(datetime,'20110504')),
test4 = dateadd(ms,-4,convert(datetime,'20110504')),
test5 = dateadd(ms,-5,convert(datetime,'20110504')),
test6 = dateadd(ms,-6,convert(datetime,'20110504'))
返回:
test1 test2 test3 test4 test5 test6
----------------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
2011-05-04 00:00:00.000 2011-05-03 23:59:59.997 2011-05-03 23:59:59.997 2011-05-03 23:59:59.997 2011-05-03 23:59:59.993 2011-05-03 23:59:59.993
正如你所看到的,MS SQL只处理毫秒到最近的3.如果你介于两者之间,它们会四舍五入。当DateTime.MaxValue存储在SQL中时,可能会发生这种情况。