为什么我的 SQL 函数不应该是不确定的?

问题描述

根据 MS docs DATEADD一个确定性函数,因此我下面的函数也应该是确定性的:

CREATE FUNCTION [dbo].[Epoch2Date] (@i INT)
RETURNS DATETIME WITH SCHEMABINDING
BEGIN
    RETURN DATEADD(SECOND,@i,'1970-01-01 00:00:00')
END

但是当我用 SELECT OBJECTPROPERTY(OBJECT_ID('[dbo].[Epoch2Date]'),'IsDeterministic') 检查它时,它返回 0(非确定性)。

  1. 为什么它是不确定的?
  2. 如何使我的函数具有确定性?

一个类似的 question,但它使用了非确定性函数 CAST,这里不是这种情况。

解决方法

DATEADD 。但是,将 varchar 隐式转换为 datetime 不是。当您使用的格式对 datetime 不明确时,这种情况尤其糟糕(尽管至少值是相同的)。

您需要使用样式显式转换值:

DATEADD(SECOND,@i,CONVERT(datetime,'19700101',112))