2009-10-27 132 views
64

在MySQLSQL Server datetime LIKE select?

select * from record where register_date like '2009-10-10%' 

什麼是SQL Server的語法?

謝謝。

+0

你究竟想要檢查什麼?給定的日期時間有給定的日期部分?或者是其他東西? – 2009-10-27 08:17:52

+1

對於這個問題的健康討論(包括爲什麼把'DATETIME'值視爲字符串不好,以及爲什麼它可能不好使用'BETWEEN'或'> = AND <='),請參閱[本博客由Aaron Bertrand] (http://is.gd/4EgDF)。 – 2009-10-27 13:14:25

+0

你的問題對於[tag:like-operator]標籤至少有5票。我可否請求你建議[標籤:sql-like]作爲[同義詞](http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit 2013-04-02 18:38:38

回答

97

您可以使用DATEPART()函數

SELECT * FROM record 
WHERE (DATEPART(yy, register_date) = 2009 
AND DATEPART(mm, register_date) = 10 
AND DATEPART(dd, register_date) = 10) 

我覺得這種方式很容易讀,因爲它忽略了時間的組件,你不必使用第二天的日期限制你的選擇。您可以通過添加額外的子句,使用適當的DatePart代碼(例如,

AND DATEPART(hh, register_date) = 12) 

得到記錄由12和1之間

獲取有效參數的完整列表,請查閱MSDN DATEPART docs

+0

如果存在索引寄存器日期,這將完全忽略索引和性能將受到影響。可能相當糟糕。 – 2009-10-27 08:19:14

+0

好的,但它確實避免了使用相當日期後一天的字符串的問題,這是在這裏的幾個答案中提出的。棘手的日期是該月的月底或年份。 – 2009-10-27 10:46:05

+3

+1爲什麼這是downvoted? – Andomar 2009-10-27 14:14:01

35

有針對DATETIME的變量,比如運營商不直接支持,但你總是可以投的DATETIME爲VARCHAR:

SELECT (list of fields) FROM YourTable 
WHERE CONVERT(VARCHAR(25), register_date, 126) LIKE '2009-10-10%' 

檢查MSDN docs爲在CONVERT功能提供「風格」的完整列表。

Marc

+0

在我看來,處理日期時間的最不希望的方式是...... – 2009-10-27 07:35:05

+0

同意 - 但OP要求一種方式來處理日期時間與LIKE ....但我同意 - 日期時間最好應該處理的範圍如> =和<=或BETWEEN - 更好的方法 – 2009-10-27 08:15:00

+0

謝謝大家。對不起,我只是SQL的新手。 – Paisal 2009-10-28 07:39:06

9

如果你這樣做,你迫使它做一個字符串轉換。這將是更好地建設一個開始/結束日期範圍,並使用:

declare @start datetime, @end datetime 
select @start = '2009-10-10', @end = '2009-11-10' 
select * from record where register_date >= @start 
      and register_date < @end 

這將允許它使用索引(如果有一個上register_date),而不是表掃描。

+0

謝謝。對不起,我只是SQL的新手。 – Paisal 2009-10-28 07:36:14

7

您可以使用CONVERT以文本形式獲取日期。如果將其轉換爲varchar(10),您可以使用=代替,如:

select * 
from record 
where CONVERT(VARCHAR(10),register_date,120) = '2009-10-10' 

或者你可以使用上下邊界日期,有額外的好處,它可以使使用索引:

select * 
from record 
where '2009-10-10' <= register_date 
and register_date < '2009-10-11' 
+0

非常感謝。 – Paisal 2009-10-28 07:40:46

+0

我認爲在where子句中存在拼寫錯誤,它應該是*「where'2009-10-10'> = register_date」* – 2017-08-06 17:56:25

+0

@mr_eclair:不這麼認爲,那將包括10月11日之前的每個日期 – Andomar 2017-08-07 07:11:32

3

您也可以使用轉換來使日期搜索使用LIKE。例如,

select convert(VARCHAR(40),create_date,121) , * from sys.objects where  convert(VARCHAR(40),create_date,121) LIKE '%17:34%' 
1

SQL Server中日期的LIKE運算符有一個非常片狀的覆蓋範圍。它只能使用美國的日期格式。舉個例子,你可以嘗試:

... WHERE register_date LIKE 'oct 10 2009%' 

我在SQL Server 2005中測試這和它的作品,但你真的需要嘗試不同的組合。我注意到奇怪的事情是:

  • 你只能似乎得到的日期內不同的子領域,全有或全無,例如,如果你搜索「4月2日%」,你只能得到20的東西 - 它省略了2nd。

  • 使用單下劃線「_」代表單(通配符)字符並不完全工作,例如WHERE mydate LIKE 'oct _ 2010%'回報所有日期前的10日 - 它返回什麼都沒有,事實上!

  • 格式是剛性的美國人:「mmm dd yyyy hh:mm

我發現很難敲定爲LIKEing秒的過程,因此,如果有人想遠一點藉此,是我的客人!

希望這會有所幫助。

6

不幸的是,使用'LIKE'不能比較datetime和varchar 但是另一種方式可能需要輸出。

select * from record where datediff(dd,[record].[register_date],'2009-10-10')=0 
+0

這對我有用。非常感謝 – 2017-11-18 05:47:46

1

LIKE運營商不會與日期部分,如一個月或日工作,但DATEPART操作一樣。

的命令找出其開放日期是1日的所有帳戶:

SELECT * 
    FROM Account 
WHERE DATEPART(DAY, CAST(OpenDt AS DATE)) = 1` 

*鑄造OpenDt,因爲它的價值是在DATETIME而不僅僅是DATE

0

我解決了我的問題。感謝您提出改進建議。 C#中的示例。

string dd, mm, aa, trc, data; 
dd = nData.Text.Substring(0, 2); 
mm = nData.Text.Substring(3, 2); 
aa = nData.Text.Substring(6, 4); 
trc = "-"; 
data = aa + trc + mm + trc + dd; 

"Select * From bdPedidos Where Data Like '%" + data + "%'";