Chọn dữ liệu từ phạm vi ngày giữa hai ngày


100

Tôi có một bảng được đặt tên Product_Salesvà nó chứa dữ liệu như thế này

Product_ID | Sold_by | Qty | From_date  | To_date
-----------+---------+-----+------------+-----------
3          | 12      | 7   | 2013-01-05 | 2013-01-07
6          | 22      | 14  | 2013-01-06 | 2013-01-10
8          | 11      | 9   | 2013-02-05 | 2013-02-11

Bây giờ truy vấn là gì nếu tôi muốn chọn dữ liệu bán hàng giữa hai ngày từ một phạm vi ngày?

Ví dụ: tôi muốn chọn dữ liệu bán hàng từ 2013-01-03đến 2013-01-09.


Đến_ngày> 2013-01-03 VÀ Từ_ngày <2013-01-09. ?
jpulikkottil

Câu trả lời:


145

mô tả khoảng giao nhau

Như bạn có thể thấy, có hai cách để hoàn thành công việc:

  • tranh thủ tất cả các lựa chọn có thể chấp nhận được
  • loại trừ tất cả các tùy chọn sai

Rõ ràng, cách thứ hai đơn giản hơn nhiều (chỉ có hai trường hợp so với bốn).

SQL của bạn sẽ giống như sau:

SELECT * FROM Product_sales 
WHERE NOT (From_date > @RangeTill OR To_date < @RangeFrom)

12
Tôi chỉ muốn nói rằng tôi thích bạn đã vẽ điều này lên bảng trắng để giải thích câu trả lời. Bạn có sự tôn trọng của tôi và sự ngưỡng mộ của tôi.
Ben Bynum

2
Tôi biết rằng vấn đề này đã khá cũ nhưng nếu bạn không muốn hoặc không thể sử dụng điều WHERE NOTkiện này , việc xoay vòng các toán tử và thêm một dấu bằng cũng đang thực hiện công việc: SELECT * FROM Product_sales WHERE From_date <= @RangeTill OR To_date >= @RangeFrom
Laurenz Glück

84
SELECT * from Product_sales where
(From_date BETWEEN '2013-01-03'AND '2013-01-09') OR 
(To_date BETWEEN '2013-01-03' AND '2013-01-09') OR 
(From_date <= '2013-01-03' AND To_date >= '2013-01-09')

Bạn phải bao gồm tất cả các khả năng. From_Date hoặc To_Date có thể nằm giữa phạm vi ngày của bạn hoặc ngày ghi có thể bao gồm toàn bộ phạm vi.

Nếu một trong From_datehoặc To_dategiữa các ngày, hoặc From_dateít hơn ngày bắt đầu và To_datelớn hơn ngày kết thúc; thì hàng này sẽ được trả lại.


Câu trả lời của trang (Y)
GreenROBO

Làm thế nào để trả về tất cả dữ liệu nếu cả ngày nhập là null hoặc rỗng? và ngoài ra, nếu một trong các ngày trống hoặc trống sẽ nhận được kết quả dựa trên tiêu chí đó
Thế giới mã hóa

40

Hãy thử truy vấn sau để lấy ngày giữa phạm vi:

SELECT  *
FROM    Product_sales 
WHERE   From_date >= '2013-01-03' AND
        To_date   <= '2013-01-09'

8
Điều này không bao gồm tất cả các khả năng!
FallenAngel

@FallenAngel, bạn có thể giải thích cho tôi biết cái nào không được bảo hiểm không?
Babblo

4
Vui lòng kiểm tra câu trả lời của tôi , bạn đã không bao gồm bán hàng bắt đầu trước đó start_datenhưng kết thúc giữa start_dateend_date. Mặt khác, câu hỏi không đủ rõ ràng mà tôi đoán, chúng tôi không có manh mối liệu chúng tôi có nên lấy doanh số bán hàng nằm giữa các ngày nhất định hoặc ngày bao gồm một phần phạm vi ngày, nhưng có thể kéo dài bên này hoặc bên kia hoặc cả hai? Vì vậy, vấn đề cơ bản là về câu hỏi không rõ ràng, tôi đoán.
FallenAngel

Tôi biết bài đăng này đã cũ nhưng đối với những người đang đọc: Đây không phải là giữa các ngày mà là Bao gồm các ngày. Từ và Đến.
Ken

23
SELECT * FROM Product_sales 
WHERE From_date between '2013-01-03'
AND '2013-01-09'

Lựa chọn của bạn sẽ sai đối với ví dụ From_date: 2012-12-30 thành To_Date: 2013-01-05. Những ngày này nằm trong phạm vi mong muốn nhưng trong SQL của bạn sẽ không được trả lại vì chúng bắt đầu trước phạm vi, nhưng chúng kết thúc bên trong phạm vi.
NetVicious

5

Điều này bao gồm tất cả các điều kiện mà bạn đang tìm kiếm.

SELECT * from Product_sales where (From_date <= '2013-01-09' AND To_date >= '2013-01-01')

4
SELECT *
FROM Product_sales
WHERE (
From_date >= '2013-08-19'
AND To_date <= '2013-08-23'
)
OR (
To_date >= '2013-08-19'
AND From_date <= '2013-08-23'
)

1
Đối với giao lộ bao gồm, bạn sẽ muốn thêm một mệnh đề HOẶC khác để bắt khi ngày_từ_ngày ở trước ngày bắt đầu và ngày_ngày_sau khi kết thúc: OR (Ngày_năm <= '2013-08-19' VÀ Từ_ngày> = '2013-08- 23 ')
jhorback

3

Vui lòng thử:

DECLARE @FrmDt DATETIME, @ToDt DATETIME
SELECT @FrmDt='2013-01-03', @ToDt='2013-01-09'

SELECT * 
FROM Product_sales 
WHERE (@FrmDt BETWEEN From_date AND To_date) OR 
    (@ToDt BETWEEN From_date AND To_date)

3

Chỉ với 2 xu của tôi, tôi thấy sử dụng định dạng "dd-MMM-yyyy" là an toàn nhất vì máy chủ db sẽ biết bạn muốn gì bất kể cài đặt khu vực trên máy chủ. Nếu không, bạn có thể gặp sự cố trên máy chủ có cài đặt khu vực ngày là yyyy-dd-mm (vì bất kỳ lý do gì)

Như vậy:

SELECT * FROM Product_sales 
WHERE From_date >= '03-Jan-2013'
AND To_date <= '09-Jan-2013'

Nó luôn hoạt động tốt cho tôi ;-)


3

Điều này hoạt động trên SQL_Server_2008 R2

Select * 
from Product_sales
where From_date 
between '2013-01-03' and '2013-01-09'

3
select * 
from table 
where
( (table.EndDate > '2013-01-05') and (table.StartDate < '2013-01-07' )  )

2

Truy vấn này sẽ giúp bạn:

select * 
from XXXX
where datepart(YYYY,create_date)>=2013 
and DATEPART(YYYY,create_date)<=2014

1
SELECT NULL  
    FROM   HRMTable hm(NOLOCK)  
    WHERE  hm.EmployeeID = 123
        AND (  
                (  
                    CAST(@Fromdate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                )  
                OR (  
                    CAST(@Todate AS date) BETWEEN CAST(hm.FromDate AS date)  
                        AND CAST(hm.ToDate AS date)  
                   )  
                ) 
         )

1

Kiểm tra truy vấn này, tôi đã tạo truy vấn này để kiểm tra xem ngày nhận phòng quá hạn với bất kỳ ngày đặt chỗ nào

SELECT * FROM tbl_ReservedRooms
WHERE NOT ('@checkindate' NOT BETWEEN fromdate AND todate
  AND '@checkoutdate'  NOT BETWEEN fromdate AND todate)

điều này sẽ tạo lại các chi tiết đang chồng chéo, để có được các chi tiết không trùng lặp, sau đó xóa 'NOT' khỏi truy vấn


1

Bạn cũng có thể thử sử dụng các đoạn sau:

select  * from  Product_sales 
where  From_date  >= '2013-01-03' and game_date  <= '2013-01-09'

1

Điều này thật dễ dàng, hãy sử dụng truy vấn này để tìm dữ liệu được chọn từ phạm vi ngày giữa hai ngày

select * from tabblename WHERE (datecolumn BETWEEN '2018-04-01' AND '2018-04-5')

0

Bạn nên so sánh các ngày trong sql giống như bạn so sánh các giá trị số,

SELECT * FROM Product_sales
WHERE From_date >= '2013-01-01' AND To_date <= '2013-01-20'

0

Đây là một truy vấn để tìm tất cả doanh số bán sản phẩm đã chạy trong tháng 8

  • Tìm Product_sales đã hoạt động trong tháng 8
  • Bao gồm mọi thứ bắt đầu trước cuối tháng 8
  • Loại trừ bất kỳ nội dung nào kết thúc trước ngày 1 tháng 8

Đồng thời thêm một câu lệnh trường hợp để xác thực truy vấn

SELECT start_date, 
       end_date, 
       CASE 
         WHEN start_date <= '2015-08-31' THEN 'true' 
         ELSE 'false' 
       END AS started_before_end_of_month, 
       CASE 
         WHEN NOT end_date <= '2015-08-01' THEN 'true' 
         ELSE 'false' 
       END AS did_not_end_before_begining_of_month 
FROM   product_sales 
WHERE  start_date <= '2015-08-31' 
       AND end_date >= '2015-08-01' 
ORDER  BY start_date; 

0
DECLARE @monthfrom int=null,
@yearfrom int=null,
@monthto int=null,
@yearto int=null,
@firstdate DATE=null,
@lastdate DATE=null

SELECT @firstdate=DATEADD(month,@monthfrom-1,DATEADD(year,@yearfrom-1900,0)) /*Setting First Date using From Month & Year*/
SELECT @lastdate= DATEADD(day,-1,DATEADD(month,@monthto,DATEADD(year,@yearto-1900,0)))/*Setting Last Date using From Month & Year*/

SELECT *  FROM tbl_Record
WHERE  (DATEADD(yy, Year - 1900, DATEADD(m, Month - 1, 1 - 1)) BETWEEN CONVERT(DATETIME, @firstdate, 102) AND 
CONVERT(DATETIME, @lastdate, 102))

-1

điều này thật dễ dàng, hãy sử dụng truy vấn này để tìm những gì bạn muốn.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.