请教大家一个关于Sql Server问题,在线等,谢谢。
EmployeeSalaryGradeID BeginDate EndDate
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2017-01-01 2019-11-30
EA0949F0-25C8-42BC-970D-BF572258309B 2019-12-01 NULL
第一条的BeginDate:2017-01-01;EndDate:2019-11-30
第二条的BeginDate:2019-12-01;EndDate:NULL (EndDate为NULL,可以当做DateTime最大值,也就是9999-12-31。 )
想要效果:
#1:现在我需要按照每年来处理:
例如,
如果我要查询2016年的,那么查不到记录,因为上面两条记录,BeginDate最小的是2017-01-01。
如果我要查询2019年的,那么需要查出来有12条记录,
分别是:
EmployeeSalaryGradeID BeginDate EndDate
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-01-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-02-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-03-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-04-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-05-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-06-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-07-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-08-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-09-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-10-01
10F8C063-C3B4-4D7D-BA0A-DF8125BE5516 2019-11-01
EA0949F0-25C8-42BC-970D-BF572258309B 2019-12-01
如果我要查询2020年的,那么需要查出来有12条记录,
分别是:
EmployeeSalaryGradeID BeginDate EndDate
EA0949F0-25C8-42BC-970D-BF572258309B 2020-01-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-02-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-03-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-04-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-05-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-06-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-07-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-08-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-09-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-10-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-11-01
EA0949F0-25C8-42BC-970D-BF572258309B 2020-12-01
总结:也就是需要筛选出具体年份的记录,然后再按照月份分割。这种效果怎么实现呢?在线等,万分感激! 展开
可以借助master..spt_values来达到你的要求。
master..spt_values:其中类型P较为特殊,它只是0-2047(与版本有关)之间的数字的简单列表,作为对所有类型之间关系的预测。
语句如下:
DECLARE @SearchYear VARCHAR(4) --查询年份
DECLARE @YearFirstDay VARCHAR(10) --查询年份第一天
DECLARE @YearLastDay VARCHAR(10) --查询年份最后一天
SET @SearchYear = '2022'
SET @YearFirstDay = @SearchYear + '-01-01'
SET @YearLastDay = @SearchYear + '-12-31'
SELECT distinct CONVERT(NVARCHAR(10), DateAdd(MONTH,number,@YearFirstDay),120) AS GroupMouth
FROM master..spt_values a CROSS JOIN Employee b
WHERE a.type = 'P' AND a.number <= DateDiff(MONTH,@YearFirstDay,@YearLastDay)
AND @YearFirstDay BETWEEN b.BeginDate AND ISNULL(b.EndDate,'9999-12-31')
ORDER BY GroupMouth
当然前面的DECLARE定义和SET赋值完全可以转换成你前端处理,后端处理主要是Select一段的逻辑。