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