SQL Запрос на получение диапазона дат на основе дат в таблице - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть некоторый код SQL, который содержится в отчете SSRS, и при запуске извлекает список задержаний студентов за определенный период, например неделю или месяц, но меня попросили автоматически запустить отчет из начало текущего школьного семестра до даты составления отчета. Это возможно? У нас есть 3 условия в год, и даты меняются каждый год. У отчета есть несколько подписок, которые будут выполняться еженедельно и фильтроваться для учащихся в конкретных дневных домах и годах, поэтому в идеале нам нужен сам отчет для обновления.

В нашей базе данных есть таблица TblSchoolManagementTermDates, которая включает столбцы txtStartDate и txtFinishDate для каждого термина.

Дата задержания хранится в столбце detPpl.dDetentionDate

Полный код SQL, который я сейчас использую:

SELECT ppl.txtSchoolID AS SchoolID,
   detPpl.TblDisciplineManagerDetentionsPupilsID AS DetentionID,
   ppl.txtSurname AS Surname,
   ppl.txtForename AS Forename,
   ppl.txtPrename AS PreferredName,
   ppl.intNCYear AS Year,
   ppl.txtAcademicHouse AS House,
   schTermDates.intSchoolYear AS AcademicYear,
   schTerms.txtName AS TermName,
   CAST(schTermDates.intSchoolYear AS CHAR(4)) + '/' +
         RIGHT(CAST(schTermDates.intSchoolYear + 1 AS CHAR(4)), 2) AS AcademicYearName,
   detPpl.dDetentionDate AS DetentionDate,
   detSessions.txtSessionName AS DetentionName,
   detPpl.txtOffenceDescription AS OffenceDescription,
   LEFT(Staff.Firstname, 1) + '. ' + Staff.Surname AS PutInBy,
   detPpl.intPresent AS AttendedDetention
FROM dbo.TblPupilManagementPupils AS ppl
 INNER JOIN
 dbo.TblDisciplineManagerDetentionsPupils AS detPpl
 ON detPpl.txtSchoolID = ppl.txtSchoolID
 INNER JOIN
 dbo.TblDisciplineManagerDetentionsSessions AS detSessions
 ON detPpl.intDetentionSessionID = detSessions.TblDisciplineManagerDetentionsSessionsID
 INNER JOIN
 dbo.TblStaff AS Staff
 ON Staff.User_Code = detPpl.txtSubmittedBy
 INNER JOIN
 dbo.TblSchoolManagementTermDates AS schTermDates
 ON detPpl.dDetentionDate BETWEEN schTermDates.txtStartDate AND schTermDates.txtFinishDate
 INNER JOIN
 dbo.TblSchoolManagementTermNames AS schTerms
 ON schTermDates.intTerm = schTerms.TblSchoolManagementTermNamesID
 LEFT OUTER JOIN
 dbo.TblDisciplineManagerDetentionsCancellations AS Cancelled
 ON Cancelled.intSessionID = detPpl.intDetentionSessionID
 AND Cancelled.dDetDate = detPpl.dDetentionDate
WHERE (ppl.txtAcademicHouse = 'Challoner') AND (Cancelled.TblDisciplineManagerDetentionsCancellationsID IS NULL) AND (CAST(detPpl.dDetentionDate AS DATE) >= CAST (GETDATE()-28 AS DATE))

ORDER BY ppl.txtSurname, ppl.txtForename, detPpl.dDetentionDate

1 Ответ

0 голосов
/ 11 февраля 2020

Вам нужно назначить пару параметров этому коду.

позволяет вызывать параметры

@ term_start

и

@ term_end

В предложении where вам просто нужно удалить этот кусок

AND (CAST(detPpl.dDetentionDate AS DATE) >= CAST (GETDATE()-28 AS DATE))

и добавить этот кусок в

AND (CAST(detPpl.dDetentionDate AS DATE) between @term_start and @term_end

Теперь создайте другой набор данных на основе ваших дат терминов - давайте назовем набор данных term_dates

как-то так (я составляю эти поля, так как не знаю, какие столбцы доступны или у меня нет образцов данных) Используйте приведенную ниже идею, чтобы приспособиться к вашим требованиям

select 

min(term_start_date) as start_date
,max(term_end_date) as end_date

from TblSchoolManagementTermNames

where convert(date,getdate()) between term_start_date and term_end_date

Теперь в вашем отчете должно быть 2 параметра. Вам просто нужно установить значение по умолчанию для параметров.

Установите значение по умолчанию для @term_start как start_date и @term_end как end_date из вашего набора данных term_dates

Запустите ваш отчет .. У вас должны быть данные между датами термина.

Это должно сработать .. если только я неправильно понял требование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...