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

标签 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

最佳答案

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

关于sql - 计算不包括假期的工作天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22249186/

相关文章:

php - mysql搜索获取特定行

SQL查询以获取每个经理下员工的递归计数

arrays - 将表示日期的 char 数组转换为自 1970 年以来的秒数

mysql - Smarty mysql 日期 + 1 天

sql - 使用 MERGE INTO 合并来自不同数据库的 2 个表

MySQL触发器根据另一个表的变化更新一个表

sql-server - 无法从 Azure VM 访问 Azure SQL Server

c# - 无法对 SQL Server Express 2008 使用 SQL Server 身份验证

java - Java 中时间的奇怪行为

sql - Hive 划分同一列的数字