Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算不包括节假日的工作天数_Sql_Sql Server_Date - Fatal编程技术网

Sql 计算不包括节假日的工作天数

Sql 计算不包括节假日的工作天数,sql,sql-server,date,Sql,Sql Server,Date,我有一个情况,我必须找出一个人在给定的日期范围内从到的出席/工作的天数 父表的数据存储在EMP中,日期位为他的工作日,我有EMPCHILD,其中他的出勤标记为datewise 我必须计算一名员工工作了多少天(不包括休息日),我不知道我该如何查询该员工工作日期之间的计数。 请帮助任何机构,下面我粘贴的SQL脚本与数据表 CREATE TABLE #EMP ( eid INT default 0, sun bit default 1, mon bit default 1,

我有一个情况,我必须找出一个人在给定的日期范围内从到的出席/工作的天数

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

我必须计算一名员工工作了多少天(不包括休息日),我不知道我该如何查询该员工工作日期之间的计数。 请帮助任何机构,下面我粘贴的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

此查询返回每个工作人员的工作日和非工作日表

编辑后:


是您现有的数据模型还是您在更改表设计方面很灵活?不,我目前的情况与我描述的完全一样这是我一生中见过的存储此类信息的最奇怪的方式,最好是在DB之外编写一些代码来计算属于业务逻辑的信息,而不是试图用简单的SQL解决此类问题。你说的员工休息日不一定是周六和周日是什么意思???或者每个员工都有自己特定的休息日???兄弟,我想通过eid计算ISWorkingDay Group,请修改queryBuddy问题是,我必须只计算员工的休息日,EMPCHILD仅用于日期选择,我想获得员工的计数,不管他参加的天数如何。我有太阳~星期六的日子。我只是想问一个有这个时间表的员工有多少天要工作你的查询很好,但是我需要工作日的ctotal计数,比如EMP.eid的group by子句,你能帮我吗?
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
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 
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