1

我有两个 sql 表。它们适用于公司的员工。一个表有通常的详细信息(id、name、surname),另一个表有他们的休假信息(empid *外键到员工表中的 id、datefrom、dateto)

我需要分解休假结构,以便我们可以显示日期。在输出中,我们将有: DateFrom DateT 18-01-2013 19-01-2013

现在,如果员工休假超过一个月(即从 29 到 5),我将打印如下值: DateFrom DateT 29-01-2013 31-01-2013 01-02-2013 05-02-2013

为了打印这个,我按月分解了一个日期范围, 这有助于分解它,谢谢你的回答。但是我如何显示哪个员工得到了所有的假期?正如我所说,这些表是链接的。我尝试使用

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

所以有人可以告诉我如何解决这个问题。希望看到正在休假的员工

4

1 回答 1

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

对此

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

原因是您从一个名为 s 的派生表中进行选择,而不是从实际的雇员表中进行选择。

于 2013-03-26T12:35:57.393 回答