2012-07-12 21 views
0

我有一個名爲CreateDate(日期時間)在table1 SQL Server中的列2008日期時間保存在錯誤SQL Server表

與存儲過程我嘗試更新CreateDate作爲參數,就像這樣:

SqlParameter spdtCreateDate = cmd.Parameters.Add("@dtDreateDate", SqlDbType.DateTime); 
spdtCreateDate.Value = dtCreateDate; 

從C#應用程序我送CreateDate='6/29/2012 12:00:00 AM'但是當我在數據庫中檢查CreateDate設置爲2012-06-28 23:00:00.000不是作爲2012-06-29 00:00:00.000

任何人都可以告訴我發生了什麼事嗎?

我該如何解決這個問題?

+0

如果你不期待2012-06-29 12:00:00?由於數據類型是DateTime,它佔小時和分鐘。我建議對數據庫運行profiler並查看正在發送的值。 – 2012-07-12 11:24:33

+0

您是否已經完成了C#代碼並確定了dtCreateDate中將值賦給參數的那個值? – MatBailie 2012-07-12 11:40:36

+0

@DarrenDavies - 請注意,中午(正如您的評論)是12:00'pm'不是'am'。午夜被認爲是一天的開始(而不是結束),並且是在12小時的時間12點00分。所以,OP希望eems對我有意義。 – MatBailie 2012-07-12 11:42:33

回答

1

SQL Server datetime類型不包含任何時區信息。因此,SQL Server客戶端庫假定您將始終要在其中存儲本地時間。如果您已將.NET DateTime值設置爲UTC時區,則SQL Server客戶端將在存儲它之前將其轉換爲本地時間。

可能的解決方案:

  • 更改.NET DateTime值,以指定DateTimeKind.UnspecifiedDateTimeKind.Local
  • 將表格列和sproc參數數據類型更改爲datetimeoffset(SQL 2008或更高版本)。
+1

的確,SQL Server不存儲時區信息,但我確信它不會將參數從UTC轉換爲本地。你有這個行爲的參考嗎? – Joe 2012-07-12 12:04:25