두 날짜 사이의 날짜 범위에서 데이터 선택


100

이름이 지정된 테이블 Product_Sales이 있으며 다음과 같은 데이터를 보유하고 있습니다.

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

이제 날짜 범위에서 두 날짜 사이의 판매 데이터를 선택하려는 경우 쿼리는 무엇입니까?

예를 들어 판매 데이터를에서 2013-01-03까지 선택하려고 합니다 2013-01-09.


To_date> 2013-01-03 AND From_date <2013-01-09. ?
jpulikkottil

답변:


144

간격 교차 설명

보시다시피 작업을 수행하는 데는 두 가지 방법이 있습니다.

  • 허용되는 모든 옵션을 입력하십시오
  • 모든 잘못된 옵션 제외

분명히 두 번째 방법은 훨씬 더 간단합니다 (4 개에 대해 2 개의 경우).

SQL은 다음과 같습니다.

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

13
답을 설명하기 위해 이것을 화이트 보드에 그린 것을 사랑한다고 말하고 싶습니다. 당신은 저를 존경하고 존경합니다.
Ben Bynum

3
나는이 문제가 꽤 오래되었다는 것을 알고 있지만이 WHERE NOT조건을 원하지 않거나 사용할 수 없다면 연산자를 돌려서 동등을 추가하는 것도 작업을 수행합니다. 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')

모든 가능성을 다루어야합니다. From_Date 또는 To_Date 는 기간 사이에 있거나 레코드 날짜가 전체 범위를 포함 할 수 있습니다.

From_date또는 중 하나가 To_date날짜 사이 에 있거나 From_date시작 날짜보다 작고 To_date종료 날짜보다 큰 경우 그러면이 행이 반환되어야합니다.


페이지 답변 (Y)
GreenROBO

입력 한 날짜가 모두 null이거나 비어있는 경우 모든 데이터를 반환하는 방법은 무엇입니까? 또한 날짜 중 하나가 null이거나 비어 있으면 해당 기준에 따라 결과를 얻어야합니다
Coding world

40

범위 사이의 날짜를 얻으려면 다음 쿼리를 시도하십시오.

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

8
이것은 모든 가능성을 포함하지 않습니다!
FallenAngel

@FallenAngel, 다루지 않은 것을 설명해 주시겠습니까?
Babblo

4
대답을 확인하십시오 . 이전에 시작 start_date되었지만 start_date과 사이에 종료 된 판매를 다루지 않았습니다 end_date. 다른 한편으로, 질문은 충분히 명확하지 않습니다. 주어진 날짜 또는 날짜 범위를 부분적으로 포함하지만 한쪽 또는 다른 쪽 또는 둘 다로 확장 될 수있는 날짜 사이에 엄격하게 판매를해야하는지에 대한 단서가 없습니다. 그래서 기본적인 문제는 질문이 명확하지 않다는 것입니다.
FallenAngel

나는이 게시물이 오래되었다는 것을 알고 있지만 읽는 사람들을 위해 : 이것은 날짜 사이가 아니라 날짜를 포함합니다. 출발 및 도착.

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

From_date : 2012-12-30 to To_Date : 2013-01-05 예제에 대한 선택이 잘못됩니다. 이러한 날짜는 원하는 범위 내에 있지만 범위 이전 에 시작 하기 때문에 SQL에서 반환되지 않지만 범위 에서 완료 됩니다 .
NetVicious

5

여기에는 찾고있는 모든 조건이 포함됩니다.

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
포괄적 교차점의 경우 시작일이 시작일 이전이고 종료일이 종료일 이후 일 때 포착 할 OR 절을 하나 더 추가 할 수 있습니다. OR (To_date <= '2013-08-19'AND From_date> = '2013-08- 23 ')
jhorback 2014

3

시도하십시오 :

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

내 2 센트 만 사용하면 "dd-MMM-yyyy"형식을 사용하는 것이 가장 안전하다는 것을 알았습니다. db 서버는 서버의 지역 설정에 관계없이 원하는 것을 알 수 있기 때문입니다. 그렇지 않으면 날짜 지역 설정이 yyyy-dd-mm 인 서버에서 잠재적으로 문제가 발생할 수 있습니다 (어떤 이유로 든)

그러므로:

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

그것은 항상 나를 위해 잘 작동했습니다 ;-)


3

이것은 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

이 쿼리는 다음을 지원합니다.

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

이 쿼리를 확인하십시오. 체크인 날짜가 예약 날짜와 중복되는지 확인하기 위해이 쿼리를 생성했습니다.

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

이것은 겹치는 세부 정보를 다시 실행하여 겹치지 않는 세부 정보를 얻은 다음 쿼리에서 'NOT'을 제거합니다.


1

다음 조각을 사용해 볼 수도 있습니다.

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

1

이 쿼리를 사용하여 두 날짜 사이의 날짜 범위에서 선택한 데이터를 찾는 것은 쉽습니다.

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

0

숫자 값을 비교하는 것처럼 SQL에서 날짜를 비교해야합니다.

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

0

다음은 8 월에 실행 된 모든 제품 판매를 찾는 쿼리입니다.

  • 8 월에 활성화 된 Product_sales 찾기
  • 8 월 말 이전에 시작된 내용 포함
  • 8 월 1 일 이전에 종료 된 모든 항목 제외

또한 쿼리의 유효성을 검사하는 case 문을 추가합니다.

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

이것은 쉽습니다.이 쿼리를 사용하여 원하는 것을 찾으십시오.

select * from Product_Sales where From_date<='2018-04-11' and To_date>='2018-04-11'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.