簡體   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