2013-03-26 86 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