【问题标题】:Replace Saturday & Sunday Date with Previous Friday Date将周六和周日日期替换为上周五日期
【发布时间】:2020-03-20 16:37:22
【问题描述】:

我有一个通用日期表。

我正在尝试实现以下输出

我似乎无法通过使用这种情况来获得正确的输出

SELECT 
DayOfWeek,
ShortDate,

CASE WHEN (DayOfWeekNumber = '1' OR DayOfWeekNumber = '7') -- Saturday or Sunday
THEN (SELECT TOP 1 ShortDate FROM DateTable DD WHERE DayOfWeekNumber = 6) 
ELSE ShortDate  END AS ExpectedShortDate

FROM DateTable
WHERE ShortDate >= '3/13/2020' 

这是我看到的输出

我明白为什么我会得到“1/5/1900”,这是因为那是我表中的第一个日期是星期五。但是,就我而言,每个星期六和星期日的日期都应该替换为上一个星期五的日期。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql sql-server tsql date


    【解决方案1】:
    SELECT 
    DayOfWeek,
    ShortDate,
    
    CASE 
    WHEN (DayOfWeekNumber = '1') -- Sunday
    THEN (select FORMAT(DATEADD(DAY, -2, ShortDate), 'MM/dd/yyyy') AS date)
    WHEN (DayOfWeekNumber = '7') -- Saturday
    THEN (select FORMAT(DATEADD(DAY, -1, ShortDate), 'MM/dd/yyyy') AS date) 
    ELSE ShortDate  END AS ExpectedShortDate
    
    FROM DateTable
    

    【讨论】:

      【解决方案2】:

      在观看 Brent Ozar 培训视频时,他建议创建一个日期表 (dbo.T_DATE),该表将存储 n 个属性,包括星期几、季度、一个月的第一天等。拥有这样的表格将使这些类型的活动轻而易举,让下一个开发人员不必阅读一些讨厌的代码。

      它可能看起来像这样:

      创建表 DBO.T_DATE(..., DATE DATETIME2, DAY_OF_WEEK VARCHAR(100), ...)

      从那里开始,我假设您可以走完剩下的路。此外,dbo.T_DATE 表还可以用作数字表,当您想防止查询循环时,它会派上用场...

      【讨论】:

        【解决方案3】:

        您可以只检查星期几并在条件表达式中相应地应用偏移量。

        假设您使用的是 SQL Server(正如您在查询中使用 select top 1 所暗示的那样):

        select
            date,
            case datepart(weekday, date)
                when 7 then dateadd(day, -1, date) -- saturday
                when 1 then dateadd(day, -2, date) -- sunday
                else date
            end expected_date
        from dateTable;
        

        【讨论】: