我有一个具有以下结构的表:
create table MyTable (
ID int identity,
Whatever varchar(100),
MyTime time(2) not null,
MyDate date not null,
MyDateTime AS (DATEADD(DAY, DATEDIFF(DAY, '19000101', [MyDate]),
CAST([MyDate] AS DATETIME2(2))))
)
计算列将日期和时间添加到单个 datetime2 字段中。大多数针对表的查询都有以下一个或多个子句:
... WHERE MyDate < @filter1 and MyDate > @filter2
... ORDER BY MyDate, MyTime
... ORDER BY MyDateTime
简而言之,Date 通常用于过滤,而 full date-time 用于排序。现在提问:
- 在这 3 个日期时间列上设置索引的最佳方法是什么?2个日期和时间分开,或者1个日期和1个复合日期时间,还是其他?这张表上发生了很多插入和更新,我想避免过度索引。
- 当我写这个问题时,我注意到计算列定义又长又有点难看。我不久前从某个地方捡起它,忘记调查是否有更简单的方法。有没有更简单的方法可以将 date 和 time2 组合到 datetime2 中?简单的加法不起作用,我不确定是否应该避免转换为 varchar、组合和转换回。