非确定性函数

时间:2016-12-23 01:22:03

标签: sql-server

sql server告诉我这个函数是不确定的。我很困惑,因为给定日期x它将始终返回相同。

DATEADD(d, 13 - DATEDIFF(d, '9/23/10', serviceDate) % 14, serviceDate)

1 个答案:

答案 0 :(得分:1)

  CONVERT(DATE,  DATEADD(d, 13 - DATEDIFF(d, CONVERT(DATE, '9/23/10',101), serviceDate) % 14, serviceDate),101)
  

在索引计算中引用日期数据类型字符串文字时   在SQL Server的列中,我们建议您显式转换   通过使用确定性日期的文字到您想要的日期类型   格式样式。有关日期格式样式的列表   确定性的,请参阅CAST和CONVERT。涉及隐含的表达式   考虑将字符串转换为日期数据类型   nondeterministic,除非数据库兼容级别设置为80   或更早。这是因为结果取决于LANGUAGE和   DATEFORMAT服务器会话的设置。例如,结果   表达CONVERT(datetime,' 30 listopad 1996',113)取决于   LANGUAGE设置,因为字符串' 30 listopad 1996'手段   不同月份的不同语言。同样,在表达式中   DATEADD(mm,3,' 2000-12-01'),数据库引擎解释字符串   ' 2000-12-01'基于DATEFORMAT设置。

     

CAST

     

确定性除非与datetime,smalldatetime或。一起使用   SQL_VARIANT。

     

CONVERT

     

确定性,除非存在以下条件之一:

     

...

     

源或目标类型是datetime或smalldatetime,另一个来源   或目标类型是字符串,非确定性样式是   指定。要确定性,样式参数必须是a   不变。另外,小于或等于100的样式是   非确定性,样式20和21除外。样式大于100   除了样式106,107,109和113之外,它们是确定性的。