2013-03-26 84 views
1

我有兩個sql表。他們是爲了一家公司的員工。一張桌子上有通常的詳細信息(ID,姓名),另一張桌子上有他們的休假信息(empid *員工表中的id,datefrom,dateto中的外鍵)如何在sql中按月分解日期範圍

我需要打破休假結構,可以顯示日期。在一個輸出中,我們將有: DateFrom DateT 18-01-2013 19-01-2013

現在如果員工已經離開了那個月(也就是從29到5) ,我會打印值,像這樣: DateFrom DateT 29-01-2013 31-01-2013 2013年1月2日2013年5月2日

打印此,我用breaking up a date range by month 這有助於打破它下來,謝謝你的答案。 但我該如何顯示哪個員工正在離開?正如我所說,這些表格是相互關聯的。我嘗試使用

select 
    e.Firstname, 
    e.Surname, 
    e.MobileNum, 
    convert(varchar(11),case when DateFrom > MonthStart then DateFrom else MonthStart end) as BeginDate, 
    convert(varchar(11),case when DateTo < MonthEnd then DateTo else MonthEnd end) as EndDate 

from(
    select l.*, 
    (
     dateadd(month,datediff(month,0,l.datefrom)+v.number,0) 
    ) as MonthStart, 
    DATEADD(day,-1, 
     dateadd(month,datediff(month,0,l.datefrom)+v.number+1,0) 
    ) as MonthEnd 

from EmployeeLeave l, Employees E 
    inner join master..spt_values v on v.type='P' 
    and v.number between 0 and DATEDIFF(month,l.datefrom,l.dateto) 
) s 

但我收到錯誤說,多部分標識符不能綁定。我找不到一個地方說

where l.empid = e.empid 

所以有人請告訴我如何解決這個問題。想看到走的是員工離開過

回答

1

您加入EmployeeLeave和這裏的員工:

from EmployeeLeave l inner join Employees E 
on l.empid = e.id 
inner join master..spt_values v on v.type='P' 
and v.number between 0 and DATEDIFF(month,l.datefrom,l.dateto) 

您可以從這裏的員工選擇字段:

from(
select l.*, e.FirstName, e.Surname, e,MobileNum 
(
    dateadd(month,datediff(month,0,l.datefrom)+v.number,0) 
) as MonthStart, etc 

然後,改變這種:

select e.Firstname, e.Surname, e.MobileNum 

to this

select s.Firstname, s.Surname, s.MobileNum 

原因是您從名爲s的派生表中進行選擇,而不是實際的employees表。

+0

做得非常好!非常感謝 – 2013-03-26 13:38:13