.net DateTime MaxValue一旦存储在数据库中就不同了

时间:2011-05-25 15:40:10

标签: c# .net sql datetime

当我在数据库中存储具有值DateTime.MaxValue的date属性并将其检索回来时,存储的值不等于DateTime.MaxValue。刻度属性已关闭。为什么是这样?

使用MS SQL,日期字段的数据类型为“datetime”

enter image description here

5 个答案:

答案 0 :(得分:24)

因为SQL datetime的分辨率较低。

  

MS SQL中的DateTime数据类型   表示来自的日期和时间数据   1753年1月1日至9999年12月31日,   准确度为1   第三百秒,或3.33   毫秒。值四舍五入为   .000,.003或.007的增量   毫秒。

source

  

.Net中的DateTime值类型   表示日期和时间   0001年1月1日午夜12:00:00   Anno Domini(共同时代)通过   公元9999年12月31日晚上11:59:59   (C.E.)时间值以   100纳秒单位称为蜱虫。

source

答案 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中时,可能会发生这种情况。