如果我在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列相同的时区上“对齐”日期文字的正确方法是什么?
答案 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
字段进行查询,它将获得您需要的信息和相应的索引。