2014-07-09 2 views
2

Если у меня есть столбец DATETIMEOFFSET в таблице SQL Server, каким образом можно фильтровать результаты по целому ряду локальных (а не UTC) дат? Под «локальным» я подразумеваю, что границы дат относятся к часовому поясу каждого сохраненного значения (которое может различаться между строками), а не по отношению к одному фиксированному локальному часовому поясу., фильтруя столбец DATETIMEOFSFSET в локальный диапазон дат

Я предполагаю, что это не так, потому что литералы 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 поле и будет иметь информацию, вам нужно, и соответствующий индекс.

 Смежные вопросы

  • Нет связанных вопросов^_^