计算不包括假期的工作天数

时间:2014-03-07 11:44:04

标签: sql sql-server date

我有一个假设,我必须找出一个人在给定的日期范围内出现/工作的天数(从 - 到)

父表的数据存储在#EMP中,天数位于他的工作日,我有#EMPCHILD,其中他的出勤标记为日期,

我必须计算一名员工已经工作了多少天,不包括他的休假日,我不知道如何查询它给了我员工工作日期之间的计数。 请帮助任何正文,下面我粘贴带有数据的表的SQL脚本

CREATE TABLE #EMP
(
    eid INT default 0,
    sun bit default 1,
    mon bit default 1,
    tue bit default 1,
    wed bit default 1,
    thu bit default 1,
    fri bit default 1,
    sat bit default 1
)
CREATE TABLE #EMPCHILD
(
    eid INT default 0,
    [date] DATETIME
)
INSERT INTO #EMP VALUES(1,0,1,0,0,1,1,1)
INSERT INTO #EMP VALUES(2,0,0,1,0,1,1,1)
INSERT INTO #EMP VALUES(3,0,1,0,0,1,1,1)
INSERT INTO #EMP VALUES(4,1,1,0,0,1,1,1)


INSERT INTO #EMPCHILD VALUES(1,'2014-03-01')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-02')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-03')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-04')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-05')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-06')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-07')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-08')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-09')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-10')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-01')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-02')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-03')
INSERT INTO #EMPCHILD VALUES(2,'2014-03-04')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-05')
INSERT INTO #EMPCHILD VALUES(4,'2014-03-06')
INSERT INTO #EMPCHILD VALUES(2,'2014-03-07')
INSERT INTO #EMPCHILD VALUES(4,'2014-03-08')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-09')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-10')
INSERT INTO #EMPCHILD VALUES(2,'2014-03-01')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-01')
INSERT INTO #EMPCHILD VALUES(4,'2014-03-01')
INSERT INTO #EMPCHILD VALUES(2,'2014-03-02')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-01')
INSERT INTO #EMPCHILD VALUES(1,'2014-03-01')
INSERT INTO #EMPCHILD VALUES(2,'2014-03-03')
INSERT INTO #EMPCHILD VALUES(4,'2014-03-04')
INSERT INTO #EMPCHILD VALUES(3,'2014-03-01')

SELECT * from #EMP
SELECT * from #EMPCHILD




DROP TABLE #EMP
DROP TABLE #EMPCHILD

现在我希望它能计算员工的工作天数(加班时间)和天数 2014-01-01至2014-01-08

通过应用以下查询:

SELECT #EMP.eid,COUNT(*) FROM #EMP
LEFT JOIN #EMPCHILD ON #EMPCHILD.eid = #EMP.eid
WHERE #EMPCHILD.[Date] between '2014-03-01' AND '2014-03-08'

GROUP BY #EMP.eid

Query Result Tentive Plan

2 个答案:

答案 0 :(得分:1)

select e.date,l.eid, dayWeek, isWork
from (
select eid,sun as [1], mon as [2], tue as [3], wed as [4], thu as [5] , fri as [6], sat as [7]  from #emp)p
unpivot 
(iswork for dayWeek in ([1],[2],[3],[4],[5],[6],[7]))l
inner join #EMPCHILD e on e.eid=l.eid and datepart(dw,e.date)=l.dayWeek
order by eid,date

此查询会为您返回一个工作表,而不是每个工作人员的工作日

答案 1 :(得分:1)

http://sqlfiddle.com/#!6/3255c/20

DECLARE @StartDate DATETIME = '2014-03-01'
DECLARE @EndDate DATETIME = '2014-03-09'

DECLARE @EId INT = 1

SELECT EC.*,

  CASE DATEPART(dw, [date])
    WHEN 1 THEN sun
    WHEN 2 THEN mon
    WHEN 3 THEN tue
    WHEN 4 THEN wed
    WHEN 5 THEN thu
    WHEN 6 THEN fri
    WHEN 7 THEN sat
  END AS IsWorkingDay

FROM EMPCHILD EC
INNER JOIN EMP E
 ON E.eid = EC.eid
WHERE [date] >= @StartDate
AND [date] < @EndDate
AND EC.eid = @EId 

编辑后: http://sqlfiddle.com/#!6/3255c/22

DECLARE @StartDate DATETIME = '2014-03-01'
DECLARE @EndDate DATETIME = '2014-03-09'

SELECT Eid, COUNT(1)
FROM (

SELECT EC.*,

  CASE DATEPART(dw, [date])
    WHEN 1 THEN sun
    WHEN 2 THEN mon
    WHEN 3 THEN tue
    WHEN 4 THEN wed
    WHEN 5 THEN thu
    WHEN 6 THEN fri
    WHEN 7 THEN sat
  END AS IsWorkingDay

FROM EMPCHILD EC
INNER JOIN EMP E
 ON E.eid = EC.eid
WHERE [date] >= @StartDate
AND [date] < @EndDate
) tbl
WHERE IsWorkingDay = 1
GROUP BY Eid
相关问题