将DATETIMEOFFSET列过滤到本地日期范围

时间:2014-07-09 20:02:43

标签: sql-server-2008 tsql timezone datetimeoffset

如果我在SQL Server表中有DATETIMEOFFSET列,那么将结果过滤到一系列本地(非UTC)日期的正确方法是什么? “本地”是指日期边界相对于每个存储值的时区(可能在行之间不同),而不是相对于单个固定的本地时区。

我认为不是这个,因为DATE文字将被假定为UTC。正确的吗?

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

这是正确的解决方案吗?

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

或者CAST功能是否阻止在EventTime列上有效使用索引?如果是这样,在与DATETIMEOFFSET列相同的时区上“对齐”日期文字的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

是的,您可以将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字段进行查询,它将获得您需要的信息和相应的索引。