VaDigar Ответов: 2

SQL-запрос, который показывает последний рабочий день месяца.


Мы говорим о нормальных неделях (м-ф), и не включая праздники.Пожалуйста, смотрите мой запрос ниже. Спасибо!

Что я уже пробовал:

CREATE FUNCTION dbo.ufn_LastBusinessDayOfMonth (@Dt datetime) RETURNS datetime
AS
BEGIN
DECLARE @dt2 datetime
DECLARE @Df int
DECLARE @dSat int
DECLARE @dSun int

SELECT @dt2 = DATEADD(D, -1, DATEADD(m, 1 + DATEDIFF(m, 0, @Dt), 0))

SELECT @dSat = DATEPART(dw, '2018-01-06') -- Known Saturday SELECT @dSun = (@dSat % 7) + 1

SELECT @dt2 = ( CASE WHEN DATEPART(dw, @dt2) = @dSun THEN DATEADD(DAY, -2, @dt2) WHEN DATEPART(dw, @dt2) = @dSat THEN DATEADD(DAY, -1, @dt2) ELSE @dt2 END)

RETURN @dt2

END

Maciej Los

Я вижу это.
Мне нужно сделать что-то еще?

2 Ответов

Рейтинг:
2

Maciej Los

Для MS SQL Server 2012 и выше вы можете использовать: EOMONTH (Transact-SQL)[^]
Далее, в зависимости от того, какой сегодня будний день, вы можете рассчитать последний рабочий день.

Проверить это:

SET DATEFIRST 1;
--1 -> Monady
--...
--7 -> Sunday

DECLARE @dt DATE = '2018-09-01'
DECLARE @dt2 DATE = EOMONTH(@dt)
DECLARE @NoOfDays INT = DATEPART(DW, @dt2)

SET @NoOfDays = CASE WHEN @NoOfDays >5 THEN 5-@NoOfDays ELSE  0 END

SELECT @dt2 AS EndOfMonth, @NoOfDays  AS [NoOfDays], DATEADD(DD, @NoOfDays, @dt2) AS LastWorkingDayOfMonth


Wendelius

Хороший совет, а 5

Maciej Los

Спасибо, Мика.

Рейтинг:
2

#realJSOP

У меня есть доступ только к SQL 2008R2 на работе, так что вы можете рассчитывать на то, что это работает во всех версиях sql server.

Попробуйте это (предостережение - не тщательно протестировано, но для указанной даты тестирования оно возвращает пятницу 8/30/2018, а для следующего месяца-понедельник 04/30/2018):

SET DATEFIRST 1;
declare @testDate date = '03/21/2018';
declare @lastWorkDay date = CASE WHEN DATEPART(WEEKDAY, DATEADD(DAY,-1,DATEADD(month, DATEDIFF(month, 0, @testdate) + 1, 0))) <= 5 
                                 THEN DATEADD(DAY,-1,DATEADD(month, DATEDIFF(month, 0, @testdate) + 1, 0))
                                 ELSE DATEADD(DAY,-(7-DATEPART(WEEKDAY, DATEADD(DAY,-1,DATEADD(month, DATEDIFF(month, 0, @testdate) + 1, 0)))+1),DATEADD(month, DATEDIFF(month, 0, @testdate) + 1, 0))
                                 END;
select @lastWorkDay;


Конечно, я не могу проверить это, пока не вернусь домой, но есть код для sql server 2012 и выше . Если вы используете 2012 или выше, просто замените приведенный выше код следующим кодом:

declare @lastWorkDay date = CASE WHEN DATEPART(WEEKDAY, EOMONTH(@testDate)) <= 5 
                                  THEN EOMONTH(@testDate)
                                  ELSE DATEADD(DAY, -(7-DATEPART(WEEKDAY, EOMONTH(@testDate))),EOMONTH(@testDate))
                                  END


РЕДАКТИРОВАТЬ ============================

Примечание: весь приведенный выше код был исправлен и проверен для работы в sql server 2012+.