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
'회사 > DB' 카테고리의 다른 글
[DB / MSSQL] / SELECT - INTO (0) | 2024.11.06 |
---|---|
[DB / MSSQL] LOB (Large Object / 대형 오브젝트) (0) | 2024.10.29 |
[DB / MSSQL] SELECT-INSERT (0) | 2024.10.28 |
[DB] 파티션 프루닝 (PARTITION PRUNING) (0) | 2024.10.28 |
[DB / MSSQL] COLLATION (정렬방식) (0) | 2024.10.16 |