![](/img/trans.png)
[英]DateTime.Now in C# to yield Datetime2(3) in SQL Server datatype
[英]c# SQL Server : DATETIME datatype
我正在編寫一個單元測試,它將帶有DateTime
參數的對象存儲到DATETIME2
SQL Server數據庫列中。 然后,我創建一個名為new_date_time
的臨時DateTime
對象,並將該值設置為DateTime.Now
。
然后,將new_date_time
值用於更新先前的值,並且執行此操作的SQL查詢成功完成。
當從數據庫重新讀取對象時,我收到了正確的datetime
值(天/小時/分鍾),但是.Ticks
值不同於new_date_time
變量.Ticks
屬性。 從read調用返回的值將.Ticks
屬性的最后4位數字返回為零。
為什么發生這種舍Assert.AreEqual
使我的Assert.AreEqual
失敗? :)
謝謝
我猜您在將日期寫入Sql Server時正在使用Parameters.AddWithValue
。 從MSDN推斷的CLR DateTime
類型是SqlDbType.DateTime
而不是 SqlDbType.DateTime2
因此在將日期寫入數據庫時,精度會丟失。
將類型明確設置為datetime2
將解決此問題。 例如:
command.Parameters.AddWithValue("@now", DateTime.Now).SqlDbType =
SqlDbType.DateTime2;
編輯
@marc_s在他的評論中提出了一個很好的觀點:
您應該閱讀(並擁抱!) 我們可以停止使用AddWithValue()了嗎?
為避免這些問題對您造成困擾,您可以養成在參數集合上使用Add
方法的習慣,該方法在某些重載AddWithValue
SqlDbType
進入,然后在其上設置Value
屬性,而不是使用AddWithValue
方法:
command.Parameters.Add("@now", SqlDbType.DateTime2).Value = DateTime.Now;
也許您的數據庫字段沒有存儲整個DateTime.Now
值,因為它不夠精確。 格式化日期后,為什么不簡單比較一下日期呢?
例如:(未試用):
var databaseDate = d1.ToString("MM/dd/yyyy HH:mm:ss.fff");
var tempDate = d2.ToString("MM/dd/yyyy HH:mm:ss.fff");
Assert.AreEqual(databaseDate, tempDate);
我測試了:使用Linq To Entities
我的DateTime.Now
正確保存到我的datetime2(7)
並且相等測試返回True
。
您確定要將正確的 datetime值傳遞給數據庫嗎? 沒有截斷嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.