我一直在寻找的日期时间确定性截断功能不可为空截断功能,这一次做的工作:确定性的日期时间
DATEADD(dd, DATEDIFF(dd, 0, @date), 0)
但是,这被认为是输入到一个持久化计算列这将成为主键的一部分,所以它必须是不可空的。所以我做了这个:
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), '01.01.1900')
但是现在表达式变得非确定性。任何人都可以告诉我为什么,以及我如何才能确定它?
谢谢!
我一直在寻找的日期时间确定性截断功能不可为空截断功能,这一次做的工作:确定性的日期时间
DATEADD(dd, DATEDIFF(dd, 0, @date), 0)
但是,这被认为是输入到一个持久化计算列这将成为主键的一部分,所以它必须是不可空的。所以我做了这个:
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), '01.01.1900')
但是现在表达式变得非确定性。任何人都可以告诉我为什么,以及我如何才能确定它?
谢谢!
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
ISNULL(DATEADD(dd, DATEDIFF(dd, 0, @date), 0), 0)
也就是说,我的猜测是不确定性的部分是'01.01.1900'
,因为它取决于区域设置。
@gbn,Martin Smith,JNK:谢谢,伙计们。 – 2012-02-24 15:40:58
我们通常在这里http://chat.stackexchange.com/rooms/179/the-heap – gbn 2012-02-24 15:43:34
不要使用字符串常量,使用一些任意的数字,而不是01 .01.1900'
@Andriy M的回答是正确的,在我之前。您应该接受 – gbn 2012-02-24 15:44:04