GetDate()是否具有确定性

时间:2014-04-22 22:08:26

标签: sql-server tsql theory

这是一个哲学问题。在一次采访中,我出席了GetDate,作为一个非确定性函数的例子。我明白为什么这个论点有水;但对我来说这似乎是一个似是而非的论点。

详细说明: 对于给定的实例(在100微秒带内),getdate将返回特定值。

对于运行到相同时钟时间的两台计算机(通过足够精确的时钟同步),它们都将返回相同的getdate值。

这是确定性的。

可以说getdate在不同的时间返回不同的值,因此不能被描述为确定性的。

但是sql查询“从y得到x,其中主键等于z”将返回x的相同值,其中z是相同的值。因此,如果时钟固定为某个值,那么我们将始终收到相同的getdate值。

换句话说,getdate的值由外部参数决定,其方式与使用where子句的SQL查询完全相同,由where子句参数控制。

那么我们为什么要暗示getdate是非确定性的,而select查询中提供结果的任何其他变量参数都被描述为确定性的。

只是为了扩展问题;如果数据发生了变化,那么我们会在select查询中收到不同的值,然后我们解释这些值不会影响确定性(硬币化一个单词),因为值已经及时更改,就像getdate一样。

要扩展(作为编辑),我可以使用XP_CmdShell设置特定日期,然后立即运行GetDate();忽略了系统速度的变幻莫测等等。然后我会得到相同的答案。这有效地否定了系统日期时间不是输入的论点,因为我通过SQL对其进行了修改,从而将整个过程保持在SQL控制的循环中。

2 个答案:

答案 0 :(得分:7)

  

对于运行到相同时钟时间的两台计算机(通过足够精确的时钟同步),它们都将返回相同的getdate值。

     

这是确定性的。

不,它不是 - 确定性意味着函数返回相同的值给定相同的输入。在这种情况下,您没有输入,但您始终获得不同的值!系统时钟不是输入,它是该功能所依赖的外部状态。

依赖于表数据的任何查询都是非确定性的,因为它依赖于外部状态。确定性函数的示例是那些不依赖于外部状态但仅依赖函数输入的函数:FLOORDATEADD等。

  

如果数据发生变化,那么我们会在select查询中收到不同的值,然后我们解释这些值不会影响确定性(硬币化一个单词),因为值已经及时更改,就像getdate一样。

实际上,这证明了查询不是确定性的 - 如果外部状态的改变改变了查询的输出。

答案 1 :(得分:-4)

根据我的经验,这是确定性的。如果你

SELECT GetDate() from TableX

如果TableX有1百万行,您可能希望为所有行返回相同的值,因为GetDate的评估不依赖于任何行中的任何值。