4

我试图坚持一个日期是在一个周末的桌子上。

ADD [IsWeekEnd] AS 
    (CASE DATEPART(dw, GETDATE()) 
         WHEN 1 THEN 1 
         WHEN 6 THEN 1 
         ELSE 0 END) PERSISTED

ADD [IsWeekEnd] AS 
    (CASE SUBSTRING(DATENAME(dw, GETDATE()), 1, 3) 
          WHEN 'Sun' THEN 1 
          WHEN 'Sat' THEN 1 
          ELSE 0 END) PERSISTED

T-SQL 不允许我这样做,因为它DatePart(dw, date)是一个非确定性函数。

消息 4936,级别 16,状态 1,第 2
行表“PowerUsage”中的计算列“IsWeekEnd”无法持久化,因为该列是不确定的。

但实际上,2013 年 7 月 1 日是星期一。所以从技术上讲,它应该通过某种方法来确定。

T-SQL 不允许我使用上述内容的原因是您可以使用更改一周的开始日期

SET DATEFIRST

然后我想也许日期之间的天数会起作用,但我也遇到了同样的问题!

ADD [IsWeekEnd] AS 
    (CASE WHEN DATEDIFF(DAY, '20070101', [datetime]) % 7 > 4 
            THEN 1 
            ELSE 0 END) PERSISTED

还有其他方法吗?

克里斯

4

1 回答 1

5

DATEDIFF 本身是确定性的。如果 '20070101' 则可以使用 39081 代替,因为字符串的隐式转换似乎被视为非确定性的。

ADD [IsWeekEnd] AS 
    (CASE WHEN DATEDIFF(DAY, 39081, [datetime]) % 7 > 4 
            THEN 1 
            ELSE 0 END) PERSISTED

39081 从

Select CAST(Cast('20070101' as DateTime) as int)  
于 2013-06-30T20:33:01.757 回答