Я пытаюсь понять, как использовать часть SSRS, основанную на данных, для отправки отчета группе людей по электронной почте в третий рабочий день месяца.
Я немного новичок в SQL, но очень быстро учусь, просто это выходит за рамки моей небольшой области знаний.
У меня есть таблица, полная дней месяцев, какого года, какого месяца, дней недели и всего этого в разных форматах даты. Я просто не могу понять это, хотя я чувствую, что это в пределах моего понимания.
Пока это то, что у меня есть, и я чувствую, что это можно обобщить в другом более простом выражении sql? Думаю, более оптимизированный.
select distinct --(CASE --when day_of_week = (2,3,4,5,6) then dateadd(day,1,day_desc_01) --when day_of_week = (7) then dateadd(day,2,day_desc_01) else day_of_week end) as 'BD_Date' day_of_week , day_desc_01 , date from Company.dbo.Company_Calendar where year = 2023 and day_of_week not in (1,7) and date <> '1900-01-01' and day_weekday_ct = 1 and year = 2023
Я просто хочу, чтобы он возвращал 3-й рабочий день месяца для каждого месяца. Затем, вероятно, заявление, в котором говорится, что если это 3-й рабочий день, сбросить отчет, если нет, ничего не делать. Я надеюсь, что это имеет немного смысла? Я также мог быть далеко от пути в этом и слишком далеко от моей головы.
Спасибо за ваше время и помощь!
Это общий пример, но вы сможете применить логику к таблице календаря вашей компании.
Этот запрос просто даст вам все 3 рабочих дня в месяце. Он отфильтровывает выходные и праздничные дни (при условии, что вы каким-то образом записываете праздничные дни в свою таблицу). После применения фильтров if просто присваивает номер строки каждой записи в каждом календарном году/месяце и возвращает только те, где он равен 3.
Для ясности добавлено несколько дополнительных столбцов.
Вы можете упростить это, но я этого не делаю; знать, что содержит ваша таблица календаря, поэтому предполагается, что в ней есть только дата (TheDate
) и столбец для обозначения PublicHoliday
.
CREATE VIEW ThirdBusDay AS
SELECT
*
FROM (
SELECT
TheDate
, DayOfWeek = DATEPART(WeekDay, TheDate)
, TheYear = YEAR(TheDate)
, TheMonth = MONTH(TheDate)
, TheDay = DAY(TheDate)
, WorkingDayOfMonth = ROW_NUMBER() OVER(PARTITION BY YEAR(TheDate), MONTH(TheDate) ORDER BY TheDate)
FROM myCalendarTable
WHERE
DATEPART(WeekDay, TheDate) NOT IN (7,1) -- Filter out Saturday and Sunday, change this if system week start is not Sunday.
AND
PublicHoliday = 0 -- filter out public holidays etc..
) d
WHERE WorkingDayOfMonth = 3
Итак, если CAST(GetDate() AS Date)
существует в этом представлении, вы знаете, что вам нужно выполнить отчет.
Столбец - Формат Дата - формат гггг-мм-дд Day_of_week - количество дней в неделе 1 - 7 день месяца - общее количество дней в месяце день квартала - количество дней в квартале день года день desc 01 - мм/дд/гггг 02 - дд-МММ-ГГГГ 03 - гггг.мм.дд 04 - 16 июля 2036 г. (месяц, день, год) день недели desc 01 - вс, пн, вт и т. д. 02 - дни с полным написанием по буквам day_weekday_ct - если это будний день, отметьте 1. если не отметьте 0. Их больше, но они делятся на кварталы, даты окончания года и тому подобное. В праздники тоже не уверен. Это была еще одна вещь, о которой я тоже думал.
Помимо праздничных дней, моему решению действительно требовался только один столбец в вашей таблице календаря. В моем примере это называется TheDate
. Этот столбец ДОЛЖЕН быть столбцом Date
. Если это varchar или что-то подобное, это не сработает. Его должно быть легко адаптировать к вашему календарю.
Потрясающе спасибо! Если я могу дать вам имена столбцов и их назначение, это поможет?