SQL Server에서 날짜 문자열을 DATETIME과 비교하기

데이터베이스, 특히 SQL Server를 사용할 때 특정 날짜를 기준으로 레코드를 필터링해야 할 경우가 많습니다. 하지만 DATETIME 열에 날짜와 시간이 저장되어 있으면, 날짜와 시간의 일부를 무시하고 싶을 때 쿼리가 복잡해질 수 있습니다. 이 블로그 포스트에서는 특정 날짜에 대한 레코드를 선택하는 효율적인 기술을 탐구하면서 시간 구성 요소와 관련된 문제를 회피하는 방법을 소개하겠습니다.

문제: 날짜별로 레코드 선택하기

예를 들어, 날짜와 시간을 모두 포함하는 column_datetime이라는 DATETIME 열이 있는 테이블이 있다고 가정해봅시다. 예를 들면:

'14 AUG 2008 14:23:01'

이제 14 AUG 2008과 같은 특정 날짜에 대한 모든 레코드를 선택하고 싶습니다. 다음과 같이 날짜만 비교하는 쿼리를 사용하면:

DECLARE @p_date DATETIME
SET @p_date = CONVERT(DATETIME, '14 AUG 2008', 106)

SELECT *
FROM table1
WHERE column_datetime = @p_date

반환된 행이 없을 가능성이 높습니다. 이는 쿼리가 시간까지 포함한 정확한 일치를 찾고 있기 때문에, 특정 레코드에 해당하는 값이 존재하지 않을 수 있기 때문입니다.

해결책: 날짜 필터링을 위한 범위 사용하기

이 문제를 해결하고 날짜별로 레코드를 성공적으로 필터링하기 위해, 쿼리 범위를 설정하는 기술을 활용할 수 있습니다. 효과적으로 수행하는 방법은 다음과 같습니다:

기술 1: 보다 크거나 및 보다 작음 사용하기

DECLARE @p_date DATETIME
SET @p_date = CONVERT(DATETIME, '14 AUG 2008', 106)

SELECT *
FROM table1
WHERE column_datetime >= @p_date
AND column_datetime < DATEADD(d, 1, @p_date)

기술 설명

  1. 날짜 선언: 먼저 변수 @p_date를 선언하고 원하는 날짜로 설정합니다.
  2. 레코드 필터링: 쿼리는 column_datetime@p_date보다 크거나 같음을 확인하여 해당 날짜의 모든 시간을 포함합니다.
  3. 다음 날 제외: DATEADD를 사용하여 column_datetime이 다음 날보다 작다는 것도 확인함으로써 다음 날짜(예: 15 AUG 2008)의 레코드를 제외합니다.

이 접근법의 장점

  • 인덱스 활용: 이 방법은 SQL Server가 column_datetime에 대한 기존 인덱스를 활용할 수 있도록 하여 쿼리 성능을 크게 향상시킬 수 있습니다.
  • 정확한 날짜 일치: 14 AUG 2008의 전체 하루 동안 기록된 모든 항목을 정확하게 캡처하며, 자정 이전의 시간까지만 포함합니다.

결론

SQL Server에서 날짜별로 레코드를 필터링하는 것은 올바른 기술을 사용하면 간단해질 수 있습니다. >=<를 이용한 범위 비교를 통해, datetime의 시간 부분을 효과적으로 무시하고 지정한 날짜와 관련된 모든 레코드를 검색할 수 있습니다. 이 방법은 정확한 결과를 얻는 데 도움을 줄 뿐만 아니라, 쿼리가 효율적으로 실행되도록 합니다.

차후 SQL Server에서 날짜를 필터링해야 할 때, 이 유용한 기술을 기억하세요! 이는 시간을 절약할 뿐만 아니라 데이터베이스 쿼리의 성능을 향상시킬 것입니다.