2009-10-27 52 views
64

trong MySQLSQL Server datetime LIKE chọn?

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

Cú pháp trong SQL Server là gì?

Cảm ơn bạn.

+0

Bạn thực sự muốn kiểm tra điều gì? Đó là một datetime nhất định có một phần ngày nhất định? Hay cái gì khác? –

+1

Để có một cuộc thảo luận lành mạnh về điều này (bao gồm lý do tại sao việc xử lý các giá trị 'DATETIME' như chuỗi và tại sao nó có thể xấu khi sử dụng' BETWEEN' hoặc '> = AND <='), hãy xem [blog này bởi Aaron Bertrand] (http://is.gd/4EgDF). –

+0

Câu hỏi của bạn có ít nhất '5' phiếu bầu cho thẻ [tag: like-operator]. Tôi có thể vui lòng yêu cầu bạn đề xuất [tag: sql-like] làm [từ đồng nghĩa] (http://stackoverflow.com/tags/like-operator/synonyms) không? – Kermit

Trả lời

97

bạn có thể sử dụng DATEPART() chức năng

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

tôi thấy cách này dễ đọc, vì nó bỏ qua các thành phần thời gian, và bạn không cần phải sử dụng ngày vào ngày hôm sau để hạn chế lựa chọn của bạn. Bạn có thể đi đến mức chi tiết lớn hơn hoặc ít hơn bằng cách thêm các mệnh đề phụ, sử dụng mã DatePart thích hợp, ví dụ:

AND DATEPART(hh, register_date) = 12) 

để có được hồ sơ thực hiện giữa 12 và 1.

Tham khảo MSDN DATEPART docs cho danh sách đầy đủ của các đối số hợp lệ.

+0

Nếu có chỉ số trên register_date, điều này sẽ hoàn toàn bỏ qua chỉ mục và hiệu suất sẽ bị ảnh hưởng. Có lẽ khá tệ. –

+0

Ok, nhưng nó tránh được vấn đề sử dụng chuỗi tương đương với ngày sau ngày được đề cập, được đề xuất trong một vài câu trả lời ở đây. Khéo léo khi ngày được đề cập là cuối tháng hoặc năm. –

+3

+1 Tại sao điều này lại được bình chọn? – Andomar

35

Không có hỗ trợ trực tiếp cho NHƯ điều hành chống lại biến DATETIME, nhưng bạn luôn có thể cast DATETIME đến một VARCHAR:

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

Kiểm tra MSDN docs cho một danh sách đầy đủ có sẵn "phong cách" trong hàm CONVERT.

Marc

+0

Điều đó dường như với tôi cách ít nhất * mong muốn để xử lý số liệu ... –

+0

đồng ý - nhưng OP đã yêu cầu một cách để xử lý datetime với LIKE .... Nhưng tôi đồng ý - thời gian tốt nhất nên được xử lý với các phạm vi như> = và <= hoặc GIỮA - cách tiếp cận tốt hơn nhiều –

+0

Cảm ơn tất cả mọi người. Xin lỗi tôi chỉ là một newbie cho SQL. – Paisal

9

Nếu bạn làm điều đó, bạn buộc phải thực hiện chuyển đổi chuỗi. Sẽ tốt hơn để xây dựng một phạm vi ngày bắt đầu/kết thúc, và sử dụng:

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 

này sẽ cho phép nó sử dụng các chỉ số (nếu có một trên register_date), chứ không phải là một bảng quét.

+0

Cảm ơn bạn. Xin lỗi tôi chỉ là một newbie cho SQL. – Paisal

7

Bạn có thể sử dụng CONVERT để nhận ngày ở dạng văn bản. Nếu bạn chuyển nó sang một varchar (10), bạn có thể sử dụng = thay vì như:

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

Hoặc bạn có thể sử dụng một ngày ranh giới trên và dưới, với những lợi thế nhất mà nó có thể làm cho việc sử dụng một chỉ số:

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

Cảm ơn bạn rất nhiều. – Paisal

+0

Tôi nghĩ rằng có lỗi đánh máy trong mệnh đề where, nó phải là * "where '2009-10-10'> = register_date" * –

+0

@mr_eclair: đừng nghĩ vậy, sẽ bao gồm mọi ngày trước ngày 11 tháng 10 – Andomar

3

Bạn cũng có thể sử dụng chuyển đổi để làm cho ngày có thể tìm kiếm bằng cách sử dụng LIKE. Ví dụ:

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

Có một phạm vi rất dễ vỡ của toán tử LIKE cho ngày tháng trong SQL Server. Nó chỉ hoạt động bằng cách sử dụng định dạng ngày của Mỹ. Ví dụ: bạn có thể thử:

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

Tôi đã thử nghiệm điều này trong SQL Server 2005 và hoạt động, nhưng bạn thực sự cần thử các kết hợp khác nhau. điều kỳ lạ tôi đã nhận thấy là:

  • Bạn chỉ dường như có được tất cả hoặc không có gì cho các lĩnh vực phụ khác nhau trong ngày, ví dụ, nếu bạn tìm kiếm '02 Tháng 4%' bạn chỉ nhận được bất cứ điều gì trong thế kỷ 20 của - nó bỏ qua thứ hai.

  • Sử dụng một dấu gạch dưới single '_' để đại diện cho một ký tự (ký tự đại diện) đơn không hoàn toàn công việc, ví dụ, WHERE mydate LIKE 'oct _ 2010%' sẽ không trở lại tất cả các ngày trước ngày 10 - nó trả gì cả, trong thực tế!

  • Định dạng là cứng nhắc Mỹ: 'mmm dd yyyy hh:mm'

tôi đã tìm thấy nó khó khăn để móng tay xuống một quá trình cho LIKEing giây, vì vậy nếu có ai muốn thực hiện việc này một chút nữa, được khách của tôi!

Hy vọng điều này sẽ hữu ích.

6

Thật không may, không thể so sánh ngày giờ với varchar bằng cách sử dụng 'LIKE' Nhưng đầu ra mong muốn có thể theo một cách khác.

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

Điều này làm việc cho tôi. Cảm ơn rất nhiều –

1

Nhà điều hành LIKE không làm việc với các bộ phận ngày như tháng hoặc ngày nhưng các nhà điều hành DATEPART làm.

Command để tìm hiểu tất cả các tài khoản có ngày mở là vào ngày 1:

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

* ĐÚC OpenDt vì giá trị của nó là ở DATETIME và không chỉ DATE.

0

Tôi đã giải quyết được sự cố của mình theo cách đó. Cảm ơn bạn đã đề xuất cải tiến. Ví dụ trong 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 + "%'"; 
Các vấn đề liên quan