Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 2008 TSQL-计算冲头之间的时间,但不包括中断时间_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 TSQL-计算冲头之间的时间,但不包括中断时间

Sql server 2008 TSQL-计算冲头之间的时间,但不包括中断时间,sql-server-2008,tsql,Sql Server 2008,Tsql,不确定这是否是一个独特的问题 我需要为劳动力跟踪系统计算打卡和打卡时间。我们的船员从上午10-10:20和下午1-1:20休息 我需要弄清楚的是,如果他们在休息时仍然被打卡,如何从总数中减去这一时间 例如,如果Joe在09:53打卡上班,在10:23打卡下班,我希望它显示10分钟而不是30分钟 我如何在10-10:20、1-1:20、11-11:20和5-5:20的几次停电时间内执行此操作?这将返回总工作分钟数。这将检查工作时间是否与每个休息时间重叠,然后将其更改为指示重叠的程度 然后计算休息时

不确定这是否是一个独特的问题

我需要为劳动力跟踪系统计算打卡和打卡时间。我们的船员从上午10-10:20和下午1-1:20休息

我需要弄清楚的是,如果他们在休息时仍然被打卡,如何从总数中减去这一时间

例如,如果Joe在09:53打卡上班,在10:23打卡下班,我希望它显示10分钟而不是30分钟


我如何在10-10:20、1-1:20、11-11:20和5-5:20的几次停电时间内执行此操作?

这将返回总工作分钟数。这将检查工作时间是否与每个休息时间重叠,然后将其更改为指示重叠的程度

然后计算休息时间的总分钟数,最后减去员工打卡的总时间


这看起来太严格了。如果工人需要在休息时间做一些工作,会发生什么?你会告诉老板等20分钟吗?我同意这很严格,但管理层想要什么,管理层会得到:打卡下班是否会与多次停电重叠?这很有可能,好吧,我会为此收取额外费用,让我看看我能做些什么。
WITH time_off as (
    SELECT * ,
           CASE WHEN w.in_w < b.out_b AND w.out_w > b.in_b
                THEN 'overlap' 
           END as overlap,
           CASE WHEN w.in_w < b.in_b 
                THEN b.in_b
                ELSE w.in_w
           END as break_start,
           CASE WHEN w.out_w > b.out_b 
                THEN b.out_b
                ELSE w.out_w
           END as break_end       
    FROM workers w
    CROSS JOIN breaks b
), break_total as (
    SELECT worker_id, in_w, out_w, SUM (CASE WHEN overlap = 'overlap'
                                             THEN datediff(minute, break_start,break_end)
                                             ELSE 0
                                        END) as break_total
    FROM time_off
    GROUP BY worker_id, in_w, out_w
)
SELECT worker_id,
       datediff(minute, in_w, out_w) - break_total as total_minutes
FROM  break_total 
SELECT * FROM time_off;
SELECT * FROM break_total;