我正在为datetime寻找一个确定性的截断函数,而这个函数完成了这个工作:
DATEADD(dd, DATEDIFF(dd, 0, @date), 0)
但是这应该是持久计算列的输入,该列将是主键的一部分,因此它必须是不可为空的。所以我做到了:
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), '01.01.1900')
但现在表达变得不确定了。任何人都可以告诉我为什么,以及我如何能确定它?
谢谢!
答案 0 :(得分:5)
01.01.1900
不确定......
这是:
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), CONVERT(datetime, '19001010', 112)))
或者
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, fooDT), 0), 0)
有关详情,请参阅导致Why is my CASE expression non-deterministic?
的best way to convert and validate a date string答案 1 :(得分:4)
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), 0)
也就是说,我的猜测是非确定性部分是'01.01.1900'
,因为它取决于区域设置。
答案 2 :(得分:0)
不要使用字符串常量,使用一些任意数字而不是'01 .01.1900'