用于获取今天日期的确定性函数



我正试图使用以下代码创建一个索引视图(这样我就可以发布它以将其复制为表):

CREATE VIEW lc.vw_dates
WITH SCHEMABINDING
AS
SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), number) AS SettingDate
FROM lc.numbers
WHERE number<8
GO
CREATE UNIQUE CLUSTERED INDEX
idx_LCDates ON lc.vw_dates(SettingDate)

lc.numbers只是一个具有1列(number)的表,该表按行1-100递增。

然而,我不断得到错误:

视图"lc.vw_dates"中的列"SettingDate"不能用于索引或统计信息,也不能用作分区键,因为它具有不确定性。

我意识到GETDATE()是不确定性的。但是,有没有办法做到这一点?

我使用的是MS SQL 2012。

编辑:希望能够转换GetDate(),使其具有确定性(剥离时间时似乎应该是这样)。如果没有人知道这样做的方法,我将结束这个问题,并将创建日历表的建议标记为正确。

确定性函数(来自MSDN)的定义是:

Deterministic函数在使用特定的一组输入值调用时,在给定相同的数据库状态时,总是返回相同的结果非确定性函数每次使用特定的一组输入值调用时,即使它们访问的数据库状态保持不变,也可能返回不同的结果。

请注意,此定义不涉及任何特定的时间跨度,在该时间跨度内,结果必须保持不变。对于给定的输入,它必须是相同的结果始终

您可以想象的任何函数在调用该函数时总是返回日期,根据定义,如果您在前一天运行该函数,然后在第二天再次运行,则会返回不同的结果(无论数据库的状态如何)。

因此,返回当前日期的函数不可能具有确定性。

对这个问题唯一可能的解释是,如果你愿意将一些关于今天的信息作为输入传递给函数,那么就可以实现确定性函数

类似于:

select fn_myDeterministicGetDate('2015-11-25')

但我认为,就你而言,这会破坏这一点。

最新更新