2014-12-19 132 views
0

我在我的表中有一個日期時間字段,我需要在where子句中使用。 的字段名是DatumAanname 在我dataviewgrid它顯示例如「16/12/2014 15時57分04秒」SQL Server比較日期時間字段

我看着網頁從微軟與所有的轉換日期時間的選擇,但這種格式不似乎在該頁面上。 我可以看到有最接近的格式爲「16 12 2014 15點57分04秒」,這應該是113

我試過這樣

SELECT o.DatumAanname, 
    (convert(DATETIME, '16 dec 2014 15:57:04:000', 113)), 
    (convert(DATETIME, '16 dec 2014 15:57:04', 113)), 
    (convert(DATETIME, o.DatumAanname, 113)) 
FROM vwOpdracht o 

這將返回4個字段的查詢,所有看起來完全一樣

但是當我做

where (convert(datetime, o.DatumAanname, 113)) = (convert(datetime, '16 dec 2014 15:57:04:000', 113)) 

返回0記錄

我在這裏做錯了什麼?

+0

是否'O操作。DatumAanname'具有'16 dec 2014 15:57:04'的日期 – 2014-12-19 08:43:54

+0

113是'dd mon yyyy hh:mm:ss:mmm' - 'mmm'部分必然是 – 2014-12-19 08:46:49

+0

正如我在我的問題中所說的,datagridview顯示記錄價值「16/12/2014 15:57:04」所以是的,價值在那裏。另外在我的問題,我說我的查詢顯示4列完全相同的價值,所以如何可能這個值不在那裏N – GuidoG 2014-12-19 08:49:10

回答

1

日期沒有格式,它們是具有自己的二進制存儲的本地類型。格式和轉換僅適用於從/轉換爲字符串時,如果使用不兼容的排序規則和文化,它們經常會導致問題。

避免問題的最佳方法是簡單地完全刪除字符串:在表中使用日期類型列並使用參數化查詢進行查詢。實際上,如果日期存儲爲表格中的文本,則存在沒有通用和防故障的方式來解決問題。

傳遞強類型值而不是字符串(例如C#中的DateTime,T-SQL中的datetime,datetime2)。例如:

where o.DatumAanname= @dateParam 

如果值匹配,將返回匹配項。

如果傳遞日期參數是不可能的,你應該只使用the unambiguous ISO8691 format,如:

where o.DatumAanname = '2014-12-16T15:57:04' 

如果你想通過日期值只可以使用未分離的格式上也毫不含糊

where o.DatumAanname = '20141216' 

有一點要注意的是,日期值必須完全匹配,直到毫秒。通常日期用於範圍查詢中,這不是問題。但在平等查詢中,這可能是一個問題。

您可以通過使用datetime2(0)作爲字段類型來避免這種情況,從而確保根本不存儲毫秒。

另一種選擇是使用範圍,而不是一個平等的查詢,如:

where o.DatumAanname between '2014-12-16T15:57:04' and '2014-12-16T15:57:04.999' 

where o.DatumAanname between '2014-12-16T15:57:00' and '2014-12-16T15:57:59' 

如果你想分鐘級精度

+0

不幸的是,數據庫是使用datetime而不是datetime2創建的。我試圖將該字段投射到datetime2,但仍包含毫秒。 – GuidoG 2014-12-19 09:29:11

+0

datetime2類型接受一個精度參數,就像'numeric'一樣,指定毫秒精度。 'datetime2(0)'不包含毫秒。您應該小心,因爲轉換或在字段上應用任何類型的函數都會阻止優化器使用索引。優化器對日期有特殊的處理,但是您應該檢查執行計劃以確保您不會最終進行全表掃描。也許你應該修改你的查詢到你想要的秒和下一個(或者你想要的任何精度級別)之間的範圍查詢, – 2014-12-19 09:36:20