SQL查询以基于表中的日期拉日期范围

时间:2020-02-10 15:44:14

标签: sql date reporting-services

我有一些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))

按ppl.txtSurname,ppl.txtForename,detPpl.dDetentionDate排序

1 个答案:

答案 0 :(得分:0)

您需要为此代码分配几个参数。

让我们调用参数

@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_dates数据集中将@term_start的默认值设置为start_date,将@term_end的默认值设置为end_date

运行报告。您应该在两个学期之间获得数据。

这应该有效..除非我误解了要求