2014-07-09 2 views
2

SQL Server 테이블에 DATETIMEOFFSET 열이있는 경우 결과를 UTC가 아닌 로컬 범위로 필터링하는 올바른 방법은 무엇입니까? "로컬"이라는 말은 날짜 경계가 하나의 고정 된 로컬 시간대를 기준으로하지 않고 저장된 값 (행마다 다를 수 있음)의 시간대와 관련이 있음을 의미합니다.DATETIMEOFFSET 열을 로컬 날짜 범위로 필터링

DATE 리터럴이 UTC로 가정되므로이 내용이 잘못되었다고 가정합니다. 옳은?

WHERE EventTime >= '20140401' AND EventTime < '20140501' 

올바른 해결책이 있습니까?

WHERE CAST (EventTime AS DATE) >= '20140401' AND CAST (EventTime AS DATE) < '20140501' 

또는 CAST 함수는 EventTime 열에서 효율적인 인덱스 사용을 방해합니까? 그렇다면 DATETIMEOFFSET 열과 같은 시간대에 날짜 리터럴을 "정렬"하는 올바른 방법은 무엇입니까?

답변

3

예, EventTime 열을 date 유형으로 캐스팅 할 수 있습니다.이 유형은 모든 시간 및 오프셋 정보를 제거하여 현지 날짜를 남겨 둡니다. 그러나 당신이 지적했듯이, 쿼리 할 때 컬럼을 캐스팅하면 성능 비용이 발생합니다.

이 목적으로 별도의 date 열을 만드는 것이 좋습니다. 뷰에서이 작업을 수행하거나 단순히 계산 된 열을 만들 수 있습니다. 그런 다음이 열에 색인을 작성할 수 있습니다. 예를 들어 :

CREATE TABLE Events (
    EventID int NOT NULL, 
    EventTime datetimeoffset NOT NULL, 
    LocalDate AS (CONVERT(date, EventTime)), -- this is the computed column 
    CONSTRAINT PK_Events PRIMARY KEY CLUSTERED (EventID) 
) 
CREATE NONCLUSTERED INDEX IX_Events_LocalDate ON Events (
    LocalDate 
) 

그런 다음 LocalDate 필드에서 조회 할 수 있습니다 그리고 당신이 필요로하는 정보와 적절한 인덱스가됩니다.