2011-05-25 40 views
22

当我在数据库中存储值为DateTime.MaxValue的日期属性并将其恢复时,存储的值不等于DateTime.MaxValue。蜱性关闭。为什么是这样?.net一旦存储在数据库中,DateTime MaxValue就会不同

使用MS SQL,对于日期字段的数据类型是“日期时间”

enter image description here

+0

你正在使用什么数据库以及数据库中存储日期的数据类型? – David 2011-05-25 15:43:02

+0

非常有趣的问题@ dev.e.loper – 2011-05-25 15:45:59

+0

你试过datetime2吗? http://technet.microsoft.com/en-us/library/bb677335.aspx – 2011-05-25 15:50:27

回答

20

由于SQL日期时间分辨率较低。

在MS SQL与一种 三百分之第二,或3.33毫秒 的精度的DateTime数据类型 表示日期和时间数据从 1753年1月1日至 12月31日,9999,。值四舍五入为.000,.003,或0.007 毫秒 增量。

source

在.net 的日期时间值类型通过 11:59表示从 12:00:00午夜,0001年1月1 公元(共同的时代)的日期和时间:59PM,9999年12月31日公元 (CE)时间值的测量值为 100纳秒单位称为蜱。

source

+0

FWIW - 我被告知这将在SQL Server 2010中解决(或者任何他们将它释放),以便DateTime数据类型匹配。 – dolphy 2011-05-25 15:54:30

+1

@dolphy,在某种程度上他们已经在SQL 2008中“修复”了它 - 它具有新的日期和时间数据类型,这将允许更多(或更少)的精度。我非常怀疑MS会不会改变“旧”日期时间数据类型的工作方式,因为这将破坏大量现有代码并剥离大部分现有客户群。 – 2011-05-25 16:02:54

+0

@菲利普凯利 - 这正是我所指的。我没有意识到这是在SQL 2008中完成的。我想这表明我的公司仍然在SQL 2005上:-) – dolphy 2011-05-25 16:17:59

1

我必须承认,我不是这肯定的,但它可能是与日期时间的准确性呢?

在这里做一个快速的搜索是在 Precision and accuracy of DateTime

的一篇文章也说不定有日期时间的在C#与SQL精度之间的mistmatch?

0

您正在存储此值的数据字段的类型是什么?

可能是因为.NET DateTime的最大值超过了数据库引擎中等效数据类型的容量。

2

这很可能会导致.NET DateTime不会直接转换为SQL DateTime类型。

我会同时设置该值,然后检查SqlDateTime.MaxValue的勾号。

0

MS SQL服务器做一些奇怪的事情在最低水平日期。例如,考虑下面的脚本:

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中时发生的情况。

相关问题