[英]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.