Вычитая один месяц из даты, но убедившись, что это первый рабочий день этого месяца - PullRequest
3 голосов
/ 30 сентября 2019

Мне нужно вычесть один месяц из даты, называемой ArchiveDate, но я хочу первый рабочий день этого месяца. Например, если моя ArchiveDate - 9/2/2018, я хотел бы иметь 1 августа 2017

Вот что у меня есть:

DECLARE @ArchiveDate date = '9/2/2019'

SELECT ArchiveDate = DATEADD(day, 
        CASE WHEN 
            DATEPART(weekday, DATEADD(MONTH, -1, @ArchiveDate)) = 1
            THEN 1
        WHEN DATEPART(weekday, DATEADD(MONTH, -1, @ArchiveDate)) = 7 THEN 2
        ELSE 0
        END
    , DATEADD(MONTH, -1, @ArchiveDate))

Что я получу от этого, это 8/2/2019, но, как вы можете видеть, я хочу 8/1/2019.

Ответы [ 3 ]

3 голосов
/ 30 сентября 2019
SELECT 
    CASE 
        WHEN DATENAME(WEEKDAY, DATEADD(mm, DATEDIFF(mm, 0, @ArchiveDate) - 1, 0)) = 'Saturday'
            THEN DATEADD(mm, DATEDIFF(mm, 0, @ArchiveDate) - 1, 0) + 2
        WHEN DATENAME(WEEKDAY, DATEADD(mm, DATEDIFF(mm, 0, @ArchiveDate) - 1, 0)) = 'Sunday'
            THEN DATEADD(mm, DATEDIFF(mm, 0, @ArchiveDate) - 1, 0) + 1
        ELSE 
            DATEADD(mm, DATEDIFF(mm, 0, @ArchiveDate) - 1, 0)
    END

Это вернет первый рабочий день предыдущего месяца.

1 голос
/ 30 сентября 2019

Вы можете использовать EOMONTH с DATEADD():

SELECT DATEADD(DAY, 1, EOMONTH(@ArchiveDate, -2)) AS ArchiveDate
1 голос
/ 30 сентября 2019

вы можете использовать eomonth вместе с вашей логикой, чтобы получить первый день предыдущего месяца, как показано ниже:

DECLARE @ArchiveDate date = '9/2/2019'

select dateadd(day, 1, eomonth(dateadd(month, -2, @ArchiveDate)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...