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

时间:2012-02-24 15:08:27

标签: sql sql-server-2005

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

DATEADD(dd, DATEDIFF(dd, 0, @date), 0)

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

ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), '01.01.1900')

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

谢谢!

3 个答案:

答案 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'