问题描述
根据 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
(非确定性)。
- 为什么它是不确定的?
- 如何使我的函数具有确定性?
有一个类似的 question,但它使用了非确定性函数 CAST
,这里不是这种情况。
解决方法
DATEADD
是。但是,将 varchar
隐式转换为 datetime
不是。当您使用的格式对 datetime
不明确时,这种情况尤其糟糕(尽管至少值是相同的)。
您需要使用样式显式转换值:
DATEADD(SECOND,@i,CONVERT(datetime,'19700101',112))