使用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