Заменить субботу и воскресенье на предыдущую пятницу - PullRequest
0 голосов
/ 20 марта 2020

У меня есть общая таблица дат c.

Я пытаюсь получить следующий вывод

enter image description here

I Кажется, я не могу получить правильный вывод, используя этот случай Я понимаю, почему я получаю «1/5/1900», потому что это первое свидание в моей таблице - пятница. Однако для моих целей каждую субботу и воскресенье следует заменять на предыдущую пятницу.

Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 20 марта 2020
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 голосов
/ 21 марта 2020

Во время просмотра обучающего видео Брента Озара он рекомендовал создать таблицу дат (dbo.T_DATE), в которой будет храниться n чисел атрибутов, включая день недели, квартал, первый день месяца и т. Д. c. Наличие такой таблицы сделает эти типы действий несложными и избавит следующего разработчика от необходимости читать какой-нибудь неприятный код.

Это может выглядеть так:

CREATE TABLE DBO.T_DATE (. .., DATE DATETIME2, DAY_OF_WEEK VARCHAR (100), ...)

Оттуда, я полагаю, вы можете взять его до конца. Кроме того, таблица dbo.T_DATE может также служить таблицей чисел, которая пригодится, когда вы хотите предотвратить зацикливание ваших запросов ...

2 голосов
/ 20 марта 2020

Вы можете просто проверить день недели и соответственно применить смещение в условном выражении.

Предполагая, что вы используете SQL Сервер (как предполагает использование 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...