请教大家一个关于Sql Server问题,在线等,谢谢。

问题描述:现在有两条记录。EmployeeSalaryGradeIDBeginDateEndDate10F8C063-C3B4-4D7D-BA0A-DF8125BE551... 问题描述:现在有两条记录。

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

总结:也就是需要筛选出具体年份的记录,然后再按照月份分割。这种效果怎么实现呢?在线等,万分感激!
展开
 我来答
xu3180497
2020-03-26 · TA获得超过1659个赞
知道小有建树答主
回答量:390
采纳率:66%
帮助的人:190万
展开全部

可以借助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一段的逻辑。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式