[英]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.