GetDate()是否具有确定性

Sim*_*onN 2 t-sql theory sql-server

这是一种哲学问题.在一次采访中,我出席了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控制的循环中.

D S*_*ley 7

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

所以这是确定性的.

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

依赖于表数据的任何查询都是非确定性的,因为它依赖于外部状态.确定性函数的例子是那些不依赖于外部的状态,而只是对投入依赖的函数: FLOOR,DATEADD,等.

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

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