Вот мой лучший ответ на оригинальный вопрос:
Попробуйте это:
/* create a deterministic schema bound function */
CREATE FUNCTION FloorDate(@dt datetime)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
RETURN CONVERT(datetime, FLOOR(CONVERT(float, @dt)))
END
GO
Чтобы проверить, попробуйте следующее. Обратите внимание на использование «PERSISTED» для вычисляемого столбца и использование [dbo.] При обращении к функции
/*create a test table */
CREATE TABLE [dbo].[TableTestFloorDate](
[Id] [int] IDENTITY(1,1) NOT NULL,
[TestDate] [datetime] NOT NULL,
[TestFloorDate] AS ([dbo].[FloorDate]([TestDate])) PERSISTED,
CONSTRAINT [PK_TableTestFloorDate] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)
Теперь у вас должна быть возможность добавить индекс для вычисляемого столбца (но смотри получится позже)
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestFloorDate)
Вставьте некоторые случайные данные столько раз, сколько пожелаете, но лучше (1000+) лучше, если вы хотите проверить планы использования / выполнения индекса
INSERT INTO TableTestFloorDate (TestDate) VALUES( convert(datetime, RAND()*50000))
Получить результаты
SELECT * FROM TableTestFloorDate WHERE TestFloorDate='2013-2-2'
Теперь вот GOTCHA ...
Индекс, созданный для вычисляемого столбца, не используется! Вместо этого, даже при выборе данных в постоянном поле TestFloorDate, SQLServer (или, по крайней мере, моя версия) предпочитает индекс для TestDate.
CREATE INDEX IX_TestFloorDate ON [dbo].[TableTestFloorDate](TestDate)
Я почти уверен (по памяти), что индексы для вычисляемых постоянных столбцов выигрывают с точки зрения производительности - я думаю, вам просто нужно попробовать / протестировать свои собственные конкретные применения
(надеюсь, я помог!)