회사/DB

[DB / MSSQL] 날짜조회 BETWEEN

daykim 2024. 10. 28. 09:42

BETWEEN 주의

D1 부터 D2 까지의 날짜에 포함되는 데이터를 조회하려고 한다.
이 때 WHERE절을 어떻게 작성해야 할지 보자.

여기서 D1, D2는 DATETIME2 타입으로  yyyy-MM-dd HH:mm:ss[.nnnnnnn] 형식이다.

 

SELECT *
FROM your_table
WHERE your_date_column BETWEEN #{D1} AND DATEADD(DAY, 1, CAST(#{D2} AS DATE))
  • DATEADD()는 #{endDate}에 하루를 더해 yyyy-MM-dd 00:00:00 형태로 처리된다.
  • BETWEEN을 사용해 날짜를 비교할 경우, 시작과 종료값을 '포함해' 비교한다.
  • 즉, 하루를 더한 yyyy-MM-dd 00:00:00 도 포함해 데이터를 조회하게 된다.
  • BETWEEN을 구우욷이 사용하고 싶다면, D2 날의 끝 시간으로 설정해서 조회할 수 있을 것이다.
  • 그런데 DATETIME2 타입은 시간 범위가 00:00:00 ~ 23:59:59.9999999 이고, 정밀도에 따라 소숫점 자리가 달라진다.

 

SELECT CAST(CONCAT(CONVERT(DATE, #{D2}), ' 23:59:59.9999999') AS DATETIME2(7)) AS EndOfToday;
  • 이렇게 하면 D2 날의 끝자릴 구할 수 있지만, 굳이?
  • DATETIME의 경우는 끝자리가 .997 이라고 한다. 
    '소수 초는 정밀도가 3자리지만, 모든 값을 정확히 표현하지 못하기 때문에 가장 가까운 값으로 반올림됩니다. ' 라고 설명한다.
  • 그렇다면 매번 DATE TYPE을 확인하면서 쿼리를 저렇게 작성하기는.. 구욷이? 라는 생각이 든다.

 

SELECT *
FROM your_table_name
WHERE D >= #{D1} AND D < DATEADD(DAY, 1, #{D2})
  • 그래서 그냥 부등호를 사용해 구현핸다.

 

음.. 더 쉬운.. 몬가 더 간단한.. 방법이 있을수도 있지 않을까

 

 

참고자료

https://learn.microsoft.com/ko-kr/sql/t-sql/data-types/datetime2-transact-sql?view=sql-server-ver16

 

datetime2(Transact-SQL) - SQL Server

datetime2는 24시간 시계에 따라 소수 자릿수가 높은 하루 중 시간과 결합되는 날짜를 정의합니다.

learn.microsoft.com