我有一个通用的日期表。
我正在尝试实现以下输出
我似乎无法通过使用这种情况来获得正确的输出
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”,这是因为那是我表中的第一个日期是星期五。但是,出于我的目的,应将每个星期六和星期日的日期替换为上一个星期五的日期。
任何帮助将不胜感激。
答案 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表还可以用作数字表,当您要防止循环查询时,该表非常有用...