繁体   English   中英

SQL查询根据表中的日期提取日期范围

[英]SQL Query to pull date range based on dates in a table

我有一些包含在 SSRS 报告中的 SQL 代码,并且在运行时会拉出一个学生在一段时间内(例如一周或一个月)被拘留的列表,但我被要求让报告从当前学校开始时自动运行期限至报告运行之日。 这可能吗? 我们每年有 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

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

让我们调用参数

@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 的默认值设置为 term_dates 数据集中的 end_date

运行您的报告。您应该拥有学期日期之间的数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM