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

发布于 2024-11-09 09:34:12 字数 200 浏览 0 评论 0原文

当我在数据库中存储值为 DateTime.MaxValue 的日期属性并将其检索回来时,存储的值不等于 DateTime.MaxValue。勾选属性已关闭。这是为什么呢?

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

在此处输入图像描述

When I store date property with value DateTime.MaxValue in database and retrieve it back, the stored value does not equal to DateTime.MaxValue. The tick properties are off. Why is this?

Using MS SQL, data type for date field is 'datetime'

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

叹梦 2024-11-16 09:34:12

因为 SQL 日期时间的分辨率较低。

MS SQL 中的日期时间数据类型
代表日期和时间数据
1753年1月1日至9999年12月31日,
准确度为一
百分之三秒,或 3.33
毫秒。值四舍五入为
增量为 0.000、0.003 或 0.007
毫秒。

来源

.Net 中的 DateTime 值类型
代表日期和时间从
0001 年 1 月 1 日午夜 12:00:00
Anno Domini(公元纪元)至
公元 9999 年 12 月 31 日,晚上 11:59:59
(CE) 时间值的测量单位为
100 纳秒单位称为刻度。

来源

Because SQL datetime has lower resolution.

The DateTime data type in MS SQL
represents Date and time data from
January 1, 1753, to December 31, 9999,
with an accuracy of one
three-hundredth second, or 3.33
milliseconds. Values are rounded to
increments of .000, .003, or .007
milliseconds.

source

The DateTime value type in .Net
represents dates and times from
12:00:00 midnight, January 1, 0001
Anno Domini (Common Era) through
11:59:59 P.M., December 31, 9999 A.D.
(C.E.) Time values are measured in
100-nanosecond units called ticks.

source

萌酱 2024-11-16 09:34:12

这很可能是因为 .NET DateTime 不能直接转换为 SQL DateTime 类型。

我会设置该值,然后根据 < 检查刻度代码>SqlDateTime.MaxValue

It could very well be cause a .NET DateTime doesn't directly translate to the SQL DateTime type.

I would both set the value and then check the ticks against SqlDateTime.MaxValue.

暖风昔人 2024-11-16 09:34:12

我必须承认我对此不确定,但这可能与日期时间的准确性有关?

快速搜索一下这里有一篇关于
日期时间的精度和准确度

另外,c# 与 sql 中的日期时间精度之间可能存在不匹配?

I must admit I'm not certain on this, but it could be to do with the accuracy of datetime?

Doing a quick search here is an article on the
Precision and accuracy of DateTime

Also perhaps there is a mistmatch between the precision of datetime in c# vs sql?

温暖的光 2024-11-16 09:34:12

您存储该值的数据字段是什么类型?

.NET DateTime 的最大值可能超出数据库引擎中等效数据类型的容量。

Of what type is the data field in which you're storing this value?

It could be that the maximum value for a .NET DateTime exceeds the capacity for the equivalent data type in the database engine.

小女人ら 2024-11-16 09:34:12

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

MS SQL Server does some odd things with dates at the lowest level. For example consider the following script:

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'))

This returns:

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

As you can see MS SQL is only dealing with milliseconds to the nearest 3. If you go between these they get rounded off. Is possible that this is what's happening when DateTime.MaxValue is getting stored in SQL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文