2011-05-23 54 views
4

我想根據特定日期查詢表,但問題是該字段的數據類型爲datetime如何通過日期查詢Datetime對象?

select * from Supplier where modified_Date='2011-05-07 12:52:16.830' 

該查詢返回結果

select * from Supplier where modified_Date='2011-05-07' 

有沒有結果

回答

5

SQL Server 2008的數據類型爲DATE。您可以將您的DATETIME投射到DATE並進行比較。

SELECT * 
FROM Supplier 
WHERE CAST(Modified_Date AS DATE) = '2011-05-07' 

參考:DateTime TransactSQL

3

您必須考慮時間因素,因爲2011-05-07 <> 2011-05-07 12:52:16.830

切換到一個範圍類型的查詢

select * from Supplier where 
    modified_Date >= '2011-05-07' 
    and 
    modified_Date < '2011-05-08' 

...或者因爲你使用SQL Server 2008

select * from Supplier where 
    CAST(modified_Date AS date) = '2011-05-07' 

從性能的角度轉換爲日期,使用第一個。或者有一個索引計算列,可爲您執行CAST並在此過濾此數據類型SQL Server 2008的數據類型爲

+0

從性能角度來看,SQL Server 2008會將第二個轉換成類似第一個的東西。 – 2011-05-23 10:11:52

+0

@Martin:是嗎?目前無法測試。想到這個雖然https://connect.microsoft.com/SQLServer/feedback/details/653206/the-optimizer-should-be-able-to-understand-the-invertability-of-built-in-intrinsics-on- date-for-the-index-index-sargability – gbn 2011-05-23 10:17:32

+0

是的,它爲計劃添加了一個計算標量,該範圍的兩端都要查找。請參閱http://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable – 2011-05-23 10:19:05

0

轉換列到日期的選擇查詢將帶來的結果。

0

剛剛發佈的替代語法GBN的回答,您還可以使用BETWEEN

SELECT * 
FROM Supplier 
WHERE modified_Date BETWEEN '2011-05-07' AND '2011-05-07 23:59:59:999' 

編輯:你必須指定的結束時間爲BETWEEN默認爲午夜這將在此返回附加行案件。

BOL

返回TRUE之間。如果 與test_expression的值大於或 等於與begin_expression 的值且小於或等於 end_expression的值,。

+0

「BETWEEN」將返回錯誤的結果。它包括''2011-05-08 00:00:00' – 2011-05-23 11:59:25

+0

這是錯誤的,它不會工作 – Nighil 2011-05-23 12:05:05

+0

道歉,你是正確的,'BETWEEN'將包括8日午夜。已編輯我的答案,以反映這一點,它確實使查詢醜陋:) – Tony 2011-05-23 13:36:38

相關問題