Sql 将周六和周日日期替换为上一个周五日期

Sql 将周六和周日日期替换为上一个周五日期,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,我有一个通用的日期表 我正在努力实现以下输出 我似乎无法通过使用此case statement获得正确的输出 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 Sho

我有一个通用的日期表

我正在努力实现以下输出

我似乎无法通过使用此case statement获得正确的输出

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' 
以下是我所看到的输出

我明白为什么我会得到“1900年1月5日”,这是因为那是我桌子上的第一个日期,也就是周五。但是,出于我的目的,每个星期六和星期日都应替换为上一个星期五


任何帮助都将不胜感激。

您只需检查一周中的哪一天,并在条件表达式中相应地应用偏移量即可

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

在观看Brent Ozar的培训视频时,他建议创建一个日期表dbo.T_Date,该表将存储n个属性,包括星期几、季度、月的第一天等。拥有这样一个表将使这些类型的活动变得简单,并避免下一个开发人员阅读一些讨厌的代码

可能是这样的:

创建表DBO.T_DATE…,DATE DATETIME2,DAY_OF_WEEK VARCHAR100

从那以后,我想你可以继续走下去。此外,dbo.T_DATE表还可以用作数字表,当您想要防止查询循环时,它非常方便

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