Я бы предпочел написать просто саркастичный
WHERE created_on >= '2019-01-01' and created_on < '2019-01-02';
*
CAST(created_on AS DATE) = '2019-01-01';
На самом деле в основном саргитный, но несколько неоптимальный ...
... и разбиение его на отдельный индексированный столбец может помочь другим случаям, таким как GROUP BY date
Если вы решите, что вам нужен отдельный столбец, вы можете создать вычисляемый столбец и индексировать его.
Это предпочтительнее, чем триггеры, так как он снижает нагрузку на производительность, а также позволяет SQL Server сопоставлять как имя столбца, так и исходное выражение.(любой индекс в столбце, заполненном триггером, не будет сопоставлен с запросом, содержащим CAST(created_on AS DATE)
)
CREATE TABLE mytable
(
[id] INT NOT NULL,
[foobar] VARCHAR(25) NULL,
[created_on] DATETIME NOT NULL,
[created_on_date] AS CAST(created_on AS DATE)
);
CREATE INDEX ix_created_on_date
ON mytable(created_on_date)
include (foobar, id, created_on)
SELECT foobar,
id,
created_on
FROM mytable
WHERE CAST(created_on AS DATE) = '2019-01-01';