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

Posted

技术标签:

【中文标题】获取今天日期的确定性函数【英文标题】:Deterministic function for getting today's date 【发布时间】:2016-02-26 07:36:21 【问题描述】:

我正在尝试使用以下代码创建索引视图(以便我可以将其发布以将其复制为表):

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() 以使其具有确定性(在剥离时间时似乎应该如此)。如果没有人知道执行此操作的方法,我将关闭此问题并将创建日历表的建议标记为正确。

【问题讨论】:

你能创建一个日历表并在它上面创建一个视图吗? 我可以,但这是我正在尝试做的一个非常精简的版本。我可能会找到另一种方法。只是想知道是否有已知的方法可以解决这个问题。 【参考方案1】:

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

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

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

任何你能想象到的总是返回日期的函数在函数被调用时,如果你一天运行它然后第二天再次运行它,根据定义,它会返回不同的结果(不管数据库的状态)。

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

对这个问题的唯一可能的解释是,如果您愿意将一些关于今天是哪一天的信息作为输入传递给函数。

类似:

select fn_myDeterministicGetDate('2015-11-25')

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

【讨论】:

以上是关于获取今天日期的确定性函数的主要内容,如果未能解决你的问题,请参考以下文章

MySQL如何获取日期表示去年的今天

如何使用窗口函数获取每个日期值的今天、过去 7 天、过去 30 天的指标?

php获取今天某个时间的时间戳的方法

MySQL内置函数获取几天前的日期

MySQL内置函数获取几天前的日期

js如何获取时间