[英]How to compare datetime with only date in SQL Server
Select * from [User] U
where U.DateCreated = '2014-02-07'
但是在數據庫中,用戶是在2014-02-07 12:30:47.220
,當時我只把'2014-02-07'
它不顯示任何數據
不要試圖做這樣的事情:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
這是一種更好的方法:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
看: Sargable (該頁面已從Wikipedia中刪除)
編輯+避免在where子句(或連接條件)中使用數據上的函數有兩個基本原因。
2014-02-07
這樣的單一標准。 改變標准以適應數據的效率要高得多。 “修改標准以適應數據”是我描述“使用SARGABLE
謂詞”的方式
並且不要在兩者之間使用。
日期和時間范圍的最佳做法是避免BETWEEN並始終使用表單:
WHERE col> ='20120101'AND col <'20120201'此表單適用於所有類型和所有精度,無論時間部分是否適用。
http://sqlmag.com/t-sql/t-sql-best-practices-part-2(Itzik Ben-Gan)
如果您使用的是SQL Server 2008或更高版本,則可以使用date數據類型:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'
應該注意的是,如果對日期列進行索引,那么它仍將使用索引並且是SARGable。 這是日期和日期時間的特例。
您可以看到SQL Server實際上將其轉換為>和<子句:
我剛剛在一個大表上嘗試了這個,根據@ kobik的注釋在日期列上有一個二級索引,並且仍然使用索引,對於使用BETWEEN或> =和<:的示例不是這種情況。
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
根據您的查詢Select * from [User] U where U.DateCreated = '2014-02-07'
SQL Server正在比較確切的日期和時間即(比較2014-02-07 12:30:47.220
與2014-02-07 00:00:00.000
相等)。 這就是為什么比較的結果是錯誤的
因此,在比較日期時,您還需要考慮時間。 您可以使用
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'
。
當然,這是一個舊線程,但要完成它。
從SQL 2008開始,您可以使用DATE數據類型,這樣您就可以執行以下操作:
SELECT CONVERT(DATE,GETDATE())
OR
Select * from [User] U
where CONVERT(DATE,U.DateCreated) = '2014-02-07'
您可以使用LIKE
語句而不是=
。 但要使用DateStamp執行此操作,您需要先將其CONVERT
為VARCHAR:
SELECT *
FROM [User] U
WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'
請試試這個。 此查詢可用於日期比較
select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.