繁体   English   中英

SQL Server和C#中的DateTime行为

[英]DateTime Behavior in SQL Server & C#

我正在通过C#代码从XML提要中提取数据。 当我得到数据时,有一个以下格式的日期时间:

  <a:updated>2010-11-05T20:21:43.8303793Z</a:updated> 

我读到DateTime类型的变量。 然后,我(使用EF)将数据放入数据库的表中。

稍后,当我的代码循环返回以再次下载该提要时,我检查了存储在数据库中的UPDATED字段中的值是否与XML提要上返回的值相同。

我正在评估:

if (currentApp.Updated < app.Updated)

其中currentApp.Updated是数据库中的内容,而app.Updated是从最新XML提要下载中读取的内容。 刚刚运行它,两者都显示(在调试窗口中):

{12/11/2010 8:13:44 PM}

但是IF语句的评估结果为TRUE。 深入研究对象可以发现:

currentApp.Updated.Ticks = 634276952242500000

app.Updated.Ticks = 634276952242511865

因此,当存储到数据库中时,似乎C#,EF或SQL Server正在转储最后5位数字(11865)并将其设置为0s(00000)。

使我沮丧。 任何想法如何解决这个问题? 我的理想是将该IF语句评估为false,因为UPDATED时间相同。

  TimeSpan tsUpdated = app.Updated - currentApp.Updated;

  if(tsUpdated.TotalMinutes > 1) 
  // Your current set of statements

根据《 Microsoft SQL Server 2005 T-SQL编程》一书,SQL Server将值四舍五入到最接近的1/300秒。

因此,我认为您应该将if语句更改为

if (currentApp.Updated - app.Updated < TimeSpan.FromMilliseconds(-3.34))

.net提供了SqlDateTime结构,以反映SQL Server和.net用于存储时间的不同方法。 从SqlDateTime的文档中:

“表示日期和时间数据,其值的范围从1753年1月1日到9999年12月31日,要存储在数据库中或从数据库中检索的精度为3.33毫秒。SqlDateTime结构具有与其对应的.NET不同的基础数据结构。框架类型DateTime可以表示12/31/9999的12:00:00 AM 1/1/0001到11:59:59 PM之间的任何时间,精度为100纳秒SqlDateTime实际上将相对差存储为00 :00:00 AM 1/1/1900。因此,从“ 00:00:00 AM 1/1/1900”到整数的转换将返回0。”

这与您的观察一致,即您从SQL返回的时间准确到毫秒级。

我建议在进行比较之前将两个时间都转换为SqlDateTime。

     DateTime currentApp = new DateTime(634276952242500000);
     DateTime app = new DateTime(634276952242511865);

     SqlDateTime currentAppSql = currentApp;
     SqlDateTime appSql = app;

     if (currentAppSql < appSql) {
     }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM