MySQL对一个表中的每一条记录的时间段进行拆分成多条记录

首先是XS数据表:

xhrxsj(入学时间)bysj(毕业时间)
0012019090120230701
0022020090120230701

然后是月份对应的XQ_YF学期表:

yf(月份)xq(学期)

1

2
3
4
5
6
7
8
9
10
11
12

首先要对求出每个xh对应的记录的入学年份,入学月份,毕业年份,毕业月份。

select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
        left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS

然后通过月份求出对应的学期,即 join 学期表,首先求出入学学期rxxq字段。

select xh,rxnf,XQ_YF.xq as rxxq,bynf,byyf
from
(select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
        left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS ) xs
left join XQ_YF
ON xs.rxyf=XQ_YF.yf

然后求出毕业学期byxq字段。

select xh,rxnf,rxxq,bynf,XQ_YF.xq as byxq
from
(select xh,rxnf,XQ_YF.xq as rxxq,bynf,byyf
from
(select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
        left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS ) xs
left join XQ_YF
ON xs.rxyf=XQ_YF.yf ) xs
left join XQ_YF
ON xs.byyf=XQ_YF.yf

此时,查询返回的字段有xh学号,rxnf入学年份,rxxq入学学期,bynf毕业年份,byxq毕业学期。

备注:把上面的代码一整个包起来,起个别名:xs。代码如下:

(select xh,rxnf,rxxq,bynf,XQ_YF.xq as byxq
from
(select xh,rxnf,XQ_YF.xq as rxxq,bynf,byyf
from
(select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
        left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS ) xs
left join XQ_YF
ON xs.rxyf=XQ_YF.yf ) xs
left join XQ_YF
ON xs.byyf=XQ_YF.yf ) xs

然后就是进行遍历,求出学生对应的每个学年学期,每个学年学期返回一条记录。

#这个是rxnf入学年份
SELECT xh, rxnf, rxxq, NULL AS bynf, NULL AS byxq
FROM xs

UNION ALL

#这个是rxnf入学年份,1学期是下半年的学期,如果rxxq等于2,这里刚好把入学年份的1学期补上,
#如果如果rxxq等于1,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, rxnf, 1, NULL AS bynf, NULL AS byxq
FROM xs

UNION ALL


SELECT xh, rxnf+1, 1, NULL, NULL
FROM xs
WHERE jcnf IS NULL OR (rxnf+1)<bynf

UNION ALL    #中间两个则是对中间所有年份的1学期,2学期进行遍历。

SELECT xh, rxnf+1, 2, NULL, NULL
FROM xs
WHERE jcnf IS NULL OR (rxnf+1)<bynf #可以用这种格式把毕业年份或者入学年份的某个学期进行添加,就不用再多写那两个多的了(长备注那两个) OR ((rxnf+1)=bynf AND byxq<>'2')

UNION ALL

#这个是bynf毕业年份
SELECT xh, bynf, NULL, bynf, byxq
FROM xs

UNION ALL

#这个是bynf毕业年份,1学期是下半年的学期,如果byxq等于1,这里刚好把毕业年份的2学期补上,
#如果如果byxq等于2,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, bynf, NULL, bynf, 2
FROM xs

然后把上面的所有代码用一对小括号包起来,并起个别名 xs。

然后按照自然学年,学期的格式进行处理。自然学年例如2022-2023。

SELECT DISTINCT xh,	#DISTINCT就是去重操作
CASE 
	WHEN bynf is NOT NULL THEN
		CASE 
		WHEN byxq=2 THEN
			CONCAT(bynf-1,'-',bynf)
		ELSE
			CONCAT(bynf,'-',bynf+1)
		END
	ELSE	#如果bynf为空,确定就不是最后毕业年份了,前面将不是毕业年份的记录毕业年份全都为NULL了
		CASE 
		WHEN rxxq=2 THEN
			CONCAT(rxnf-1,'-',rxnf)
		ELSE
			CONCAT(rxnf,'-',rxnf+1)
		END
END as xn,
CASE 
	WHEN byxq is NOT NULL THEN
		byxq
	ELSE
		rxxq
END xq
FROM xs #xs表就是我们前面的(所有代码) as xs

直到这里就是算出每个xh学号包含的所有自然学年,学期了。

以下就是完整代码:

SELECT DISTINCT xh,	#DISTINCT就是去重操作
CASE 
	WHEN bynf is NOT NULL THEN
		CASE 
		WHEN byxq=2 THEN
			CONCAT(bynf-1,'-',bynf)
		ELSE
			CONCAT(bynf,'-',bynf+1)
		END
	ELSE	#如果bynf为空,确定就不是最后毕业年份了,前面将不是毕业年份的记录毕业年份全都为NULL了
		CASE 
		WHEN rxxq=2 THEN
			CONCAT(rxnf-1,'-',rxnf)
		ELSE
			CONCAT(rxnf,'-',rxnf+1)
		END
END as xn,
CASE 
	WHEN byxq is NOT NULL THEN
		byxq
	ELSE
		rxxq
END xq
FROM 
(#这个是rxnf入学年份
SELECT xh, rxnf, rxxq, NULL AS bynf, NULL AS byxq
FROM xs

UNION ALL

#这个是rxnf入学年份,1学期是下半年的学期,如果rxxq等于2,这里刚好把入学年份的1学期补上,
#如果如果rxxq等于1,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, rxnf, 1, NULL AS bynf, NULL AS byxq
FROM xs

UNION ALL


SELECT xh, rxnf+1, 1, NULL, NULL
FROM xs
WHERE jcnf IS NULL OR (rxnf+1)<bynf

UNION ALL    #中间两个则是对中间所有年份的1学期,2学期进行遍历。

SELECT xh, rxnf+1, 2, NULL, NULL
FROM xs
WHERE jcnf IS NULL OR (rxnf+1)<bynf #可以用这种格式把毕业年份或者入学年份的某个学期进行添加,就不用再多写那两个多的了(长备注那两个) OR ((rxnf+1)=bynf AND byxq<>'2')

UNION ALL

#这个是bynf毕业年份
SELECT xh, bynf, NULL, bynf, byxq
FROM xs

UNION ALL

#这个是bynf毕业年份,1学期是下半年的学期,如果byxq等于1,这里刚好把毕业年份的2学期补上,
#如果如果byxq等于2,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, bynf, NULL, bynf, 2
FROM xs

) xs #xs表就是我们前面的(所有代码) as xs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

缱绻命运

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值