2009-04-14 32 views

Trả lời

220

Toán tử BETWEEN được bao gồm.

Từ Sách Online:

GIỮA trả về TRUE nếu giá trị của test_expression là lớn hơn hoặc tương đương với giá trị của begin_expression và nhỏ hơn hoặc bằng với giá trị của end_expression.

DateTime Caveat

NB: Với DateTimes bạn phải cẩn thận; nếu chỉ có một ngày được cho thì giá trị được lấy vào lúc nửa đêm vào ngày đó; để tránh số lần bị thiếu trong ngày kết thúc của bạn hoặc lặp lại dữ liệu của ngày hôm sau vào lúc nửa đêm trong nhiều phạm vi, ngày kết thúc của bạn phải là 3 mili giây trước nửa đêm trong ngày sau ngày cập nhật của bạn. 3 mili giây vì bất kỳ giá trị nào nhỏ hơn giá trị này và giá trị sẽ được làm tròn đến nửa đêm ngày hôm sau.

ví dụ: để có được tất cả các giá trị trong tháng 6 2016 bạn cần phải chạy:

where myDateTime between '2016-06-01' and dateadd(millisecond, -3, '2016-07-01')

tức

where myDateTime between '2016-06-01 00:00:00.000' and '2016-07-01 23:59:59.997'

+5

Khi sử dụng GIỮA để lọc Ngày giờ giữa hai ngày, bạn cũng có thể truyền Ngày giờ thành Ngày, ví dụ: nơi CONVERT (DATE, MyDate) GIỮA '2017-09-01' và '2017-09-30 'Cách tiếp cận này làm cho phần tử thời gian của DateTime không liên quan – Pete

10

BETWEEN (Transact-SQL)

Chỉ định một (n) (bao gồm) phạm vi để kiểm tra.

test_expression [ NOT ] BETWEEN begin_expression AND end_expression 

Arguments

test_expression 

là sự biểu hiện để kiểm tra trong phạm vi xác định bởi begin_expression và end_expression. test_expression phải cùng loại dữ liệu với cả hai kiểu starts_expression và end_expression.

NOT 

Chỉ định kết quả của vị từ bị phủ định.

begin_expression 

Có bất kỳ biểu thức hợp lệ nào. begin_expression phải là cùng một dữ liệu loại như cả test_expression và thiết lập.

end_expression 

Có bất kỳ biểu thức hợp lệ nào.end_expression phải cùng một dữ liệu loại như cả test_expression và begin_expression.

AND 

Hoạt động như một trình giữ chỗ cho biết test_expression nên trong phạm vi chỉ định bởi begin_expression và end_expression.

Bình luận

Để xác định một phạm vi độc quyền, sử dụng lớn hơn (>) và ít hơn nhà khai thác (<). Nếu bất kỳ đầu vào nào cho số GIỮA hoặc KHÔNG GIỮA vị ngữ là NULL, kết quả là KHÔNG CÒN.

quả Value

GIỮA trả về TRUE nếu giá trị của test_expression là lớn hơn hoặc tương đương với giá trị của begin_expression và nhỏ hơn hoặc bằng với giá trị của end_expression.

KHÔNG GIỮA trả về TRUE nếu giá trị của test_expression nhỏ hơn giá trị của begin_expression hoặc lớn hơn so với giá trị của biểu thức.

237

Có, nhưng hãy cẩn thận khi sử dụng giữa các ngày.

BETWEEN '01/01/2009' AND '01/31/2009' 

thực sự được hiểu là 00:00, hoặc

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 00:00:00' 

như vậy sẽ bỏ lỡ bất cứ điều gì đã xảy ra trong ngày 31 tháng 1. Trong trường hợp này, bạn sẽ phải sử dụng:

myDate >= '01/01/2009 00:00:00' AND myDate < '02/01/2009 00:00:00' --CORRECT! 

hoặc

BETWEEN '01/01/2009 00:00:00' AND '01/31/2009 23:59:59' --WRONG! (see update!) 

CẬP NHẬT: Điều này hoàn toàn có thể có hồ sơ được tạo ra trong giây phút cuối cùng của ngày, với một datetime như cuối là 01/01/2009 23:59:59.997 !!

Vì lý do này, cách tiếp cận BETWEEN (firstday) AND (lastday 23:59:59) không được khuyến nghị.

Thay vào đó, hãy sử dụng phương pháp myDate >= (firstday) AND myDate < (Lastday+1).

Tốt article on this issue here.

+1

Các vấn đề tương tự với chuỗi cũng như' WHERE col BETWEEN 'a' AND 'z'' sẽ loại trừ hầu hết các hàng z chẳng hạn. –

+7

Điểm này dĩ nhiên là đúng; nhưng không nên ngạc nhiên nếu bạn đang làm việc với các datetimes. Tương tự như chỉ ra rằng 'GIỮA 5 VÀ 10' không bao gồm' 10.2' ... –

+4

'CAST'ing' datetime' là 'DATE' sẽ hoạt động:' CAST (DATE_TIME_COL AS DATE) GIỮA '01/01/2009 'AND '01/31/2009''. – craig

16

Bất dụ thế giới từ SQL Server 2008.

alt text

+0

+1 cảm ơn rất nhiều ... –

+0

Tôi đã không nhận được câu trả lời của bạn, phải trung thực. Có thể nhà cung cấp internet của tôi đã ẩn ảnh chụp màn hình của bạn nếu bạn đã đăng ảnh. –

+0

@Anar, liên kết trực tiếp tới hình ảnh là http://imgur.com/sTKRO.png. –

12

nếu bạn nhấn này, và không thực sự muốn thử và xử lý thêm một ngày trong mã, sau đó để cho các DB làm điều đó ..

myDate >= '01/01/2009 00:00:00' AND myDate < DATEADD(day,1,'01/01/2009 00:00:00') 
3

Nếu kiểu dữ liệu cột là datetime thì bạn có thể thực hiện việc này sau để loại bỏ thời gian từ ngày giờ và chỉ so sánh giữa phạm vi ngày.

where cast(getdate() as date) between cast(loginTime as date) and cast(logoutTime as date) 
+1

Lưu ý rằng đó không phải là [sargable] (http://en.wikipedia.org/wiki/Sargable). –

+0

Tính năng này hoạt động tốt hơn việc thêm +1 vào ngày kết thúc. Tôi đồng ý với Andrew Morton - nếu nó không phải là sargable nó có thể cải thiện hiệu suất để thay đổi kiểu dữ liệu cột hoặc thêm cột thứ hai chỉ với các ngày được tính trước. – Volkirith

-2

Tôi luôn sử dụng này:

ĐÂU mydate GIỮA STARTDATE AND (ENDDATE + 1)

0

Nó bao gồm ranh giới.

declare @startDate date = cast('15-NOV-2016' as date) 
declare @endDate date = cast('30-NOV-2016' as date) 
create table #test (c1 date) 
insert into #test values(cast('15-NOV-2016' as date)) 
insert into #test values(cast('20-NOV-2016' as date)) 
insert into #test values(cast('30-NOV-2016' as date)) 
select * from #test where c1 between @startDate and @endDate 
drop table #test 
RESULT c1 
2016-11-15 
2016-11-20 
2016-11-30 


declare @r1 int = 10 
declare @r2 int = 15 
create table #test1 (c1 int) 
insert into #test1 values(10) 
insert into #test1 values(15) 
insert into #test1 values(11) 
select * from #test1 where c1 between @r1 and @r2 
drop table #test1 
RESULT c1 
10 
11 
15 
Các vấn đề liên quan