【问题标题】:How to persist a bit field indicating a date is on a weekend?如何保留指示日期在周末的位字段?
【发布时间】:2013-06-30 19:18:00
【问题描述】:

我试图在表格中坚持日期是周末。

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

还有其他方法吗?

克里斯

【问题讨论】:

    标签: sql-server tsql date persistence weekend


    【解决方案1】:

    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)  
    

    【讨论】:

    • 谢谢 - 正是我所需要的 - 我从没想过导致问题的隐式转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    相关资源
    最近更新 更多