使用sql查询生成开始到结束日期之间的所有日期


公司的请休假,出差表上只记录了开始时间和结束时间,万恶的人事要做一个报表,要把员工的情况显示出来如图一所示,想了好多百度了好多,总算把sql整出来了

图一:

 

sql:

with cte as (select 
formmain_4740.id id,
formmain_4740.finishedflag finishedflag,
formmain_4740.ratifyflag ratifyflag ,
枚举值表1.MJNAME MJNAME,
ORG_MEMBER.mname mname,
org_unit.name name,
formmain_4740.field0009 field0009,
formmain_4740.field0010 field0010,
formmain_4740.field0011 field0011,
formmain_4740.field0012 field0012,
formmain_4740.field0025 field0025,
formmain_4740.field0027 field0027,
formson_4787.field0020 field0020,
formson_4787.field0023 field0023,
formson_4787.field0021 dday,
formson_4787.field0022 EndDate
from formson_4787 left join formmain_4740 on formson_4787.formmain_id=formmain_4740.id
left join (select id AS MID, name AS MNAME from ORG_MEMBER) org_member
on formmain_4740.field0004 = ORG_MEMBER.Mid
left join (SELECT ID AS MJID, 枚举名称 as mjname from 枚举值表) 枚举值表1
ON formson_4787.field0020 = 枚举值表1.MJID
left join org_unit on formmain_4740.field0005=org_unit.id
where 
ratifyflag = 1
and Datename(year,formson_4787.field0021)='2018'
and org_unit.name='部门'
union all
select
id,
finishedflag,
ratifyflag ,
MJNAME,
mname,
name,
field0009,
field0010,
field0011,
field0012,
field0025,
field0027,
field0020,
field0023,
dday+1,EndDate from cte
where convert(nvarchar(10),dday,120) < convert(nvarchar(10),EndDate,120))
select * from cte order by mname,dday

简单的可以理解为:

 

with test as
(
  select 
    field0021 dday,
    field0022 EndDate
  from formson_1234
  union all
  select 
    dday+1,
    EndDate 
  from test 
  where convert(nvarchar(10),dday,120) < convert(nvarchar(10),EndDate,120))
)

select * from test

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM