2012-08-16 87 views
11

如何在SQL Server中DateTime數據類型的列上執行LIKE語句?DateTime類型的SQL LIKE語句

如果我運行下面的SQL返回我的一切與2009年的日期英寸

SELECT * FROM MyTable where CheckDate LIKE '%2009%' 

但是,如果我想所有的十月,十一月&月我預計日期是能夠做到的如下:

SELECT * FROM MyTable where CheckDate LIKE '%2009-1%' 

但是這沒有回報我!

我給用戶一個過濾器選項,他們鍵入日期字符串,當他們鍵入I過濾數據。因此,如果他們輸入'20',我想在日期內返回所有日期'20'(所以這可能是所有2012日期或日期值,如06/20/1999)

任何人都可以幫助?

我正在使用SQL Server 2008.

在此先感謝。

+0

感謝您的回覆,我已經更新了更多的細節什麼,我試圖做 – Sun 2012-08-16 10:54:05

+0

你檢查你的用戶需要這類設施的工作嗎?我從來沒有想過要找到「在任何一個月的第10天,或在10月或2010年發生的所有活動」。 – 2012-08-16 10:55:29

回答

20

您可以使用DATEPART函數來提取部分日期。它也應該讓你的查詢更加明確你希望達到的目的是什麼:

SELECT * FROM MyTable 
where DATEPART(year,CheckDate)=2009 and 
     DATEPART(month,CheckDate) between 10 and 12 

(還有一些特別命名的功能,如MONTHYEAR,但我更喜歡DATEPART的一致性,因爲它可以訪問所有組件datetime

您應該儘量避免將datetimes視爲具有任何形式的字符串格式。將它們視爲字符串是我們遇到的最大的錯誤來源之一。

2

您可以使用這樣的事情:

SELECT * 
FROM MyTable 
WHERE CheckDate >= '2009-10-01' AND CheckDate < '2010-01-01'; 
+1

雖然你在它 - 嘗試使用**語言無關的**日期格式 - 如「20091001」 - 適用於所有**語言版本的SQL Server .... – 2012-08-16 10:51:47

+3

危險。儘管原始查詢強制將'datetime'轉換爲字符串(並且始終會生成一致的格式化值),但這會強制從字符串到'datetime'的轉換,並且根據區域設置,實際上可能會查詢任何內容在2009年1月10日或之後 – 2012-08-16 10:53:14

5

如果您需要使用Like運營商(出於某種原因),你必須在DateTime列轉換成varchar

SELECT * 
FROM MyTable 
WHERE CONVERT(VARCHAR, CheckDate, 120) LIKE '%2009-1%'