2014-07-09 31 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領域查詢,這將有您需要的信息和適當的索引。