用上一个星期五日期替换星期六和星期日日期

时间:2020-03-20 16:37:22

标签: sql sql-server tsql date

我有一个通用的日期表。

我正在尝试实现以下输出

enter image description here

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

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' 

这是我所看到的输出

enter image description here

我知道为什么我会得到“ 1/5/1900”,这是因为那是我表中的第一个日期是星期五。但是,出于我的目的,应将每个星期六和星期日的日期替换为上一个星期五的日期。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

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

假设您正在使用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;

答案 1 :(得分:2)

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 :(得分:2)

在观看布伦特·奥扎尔(Brent Ozar)培训视频时,他建议创建一个日期表(dbo.T_DATE),该表将存储n个属性,包括星期几,季度,每月的第一天等。拥有这样的表可以这些类型的活动很快完成,并节省了下一个开发人员不必阅读某些讨厌的代码的麻烦。

它可能看起来像这样:

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

从那里开始,我假设您可以按照其余方式进行操作。此外,dbo.T_DATE表还可以用作数字表,当您要防止循环查询时,该表非常有用...