日期时间的确定性非可空截断函数

erc*_*can 2 sql sql-server-2005

我正在为datetime寻找一个确定性截断函数,这个函数完成了这项工作:

DATEADD(dd, DATEDIFF(dd, 0, @date), 0)
Run Code Online (Sandbox Code Playgroud)

但这应该是持久计算列的输入,它将成为主键的一部分,因此它必须是不可为空的.所以我做了这个:

ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), '01.01.1900')
Run Code Online (Sandbox Code Playgroud)

但现在表达变得不确定了.任何人都可以告诉我为什么,以及如何让它确定性?

谢谢!

gbn*_*gbn 5

01.01.1900 不是确定性的......

这是:

ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), CONVERT(datetime, '19001010', 112)))
Run Code Online (Sandbox Code Playgroud)

或这个

ISNULL(DATEADD(dd, DATEDIFF(dd, 0, fooDT), 0), 0)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅为什么我的CASE表达式不确定?这导致转换和验证日期字符串的最佳方式