Chr*_*owe 4 t-sql sql-server persistence date weekend
我试图坚持在一个桌子周末约会.
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
Run Code Online (Sandbox Code Playgroud)
T-SQL不允许我这样做,因为它DatePart(dw, date)是一个非确定性函数.
消息4936,级别16,状态1,行2
表'PowerUsage'中的计算列'IsWeekEnd'无法保留,因为该列是非确定性的.
但实际上,2013年7月1日是星期一.所以在技术上它应该是某种方法的确定性.
T-SQL不允许我使用上述内容的原因是您可以使用更改一周的开始日期
SET DATEFIRST
Run Code Online (Sandbox Code Playgroud)
然后我想也许日期之间的天数可能有效,但我也遇到了同样的问题!
ADD [IsWeekEnd] AS
(CASE WHEN DATEDIFF(DAY, '20070101', [datetime]) % 7 > 4
THEN 1
ELSE 0 END) PERSISTED
Run Code Online (Sandbox Code Playgroud)
还有其他方法吗?
克里斯
DATEDIFF本身是确定性的.如果是'20070101',则可以使用39081,因为来自字符串的隐式转换似乎被视为非确定性的.
ADD [IsWeekEnd] AS
(CASE WHEN DATEDIFF(DAY, 39081, [datetime]) % 7 > 4
THEN 1
ELSE 0 END) PERSISTED
Run Code Online (Sandbox Code Playgroud)
39081来自
Select CAST(Cast('20070101' as DateTime) as int)
Run Code Online (Sandbox Code Playgroud)