首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TSQL -计算两次击打之间的时间,但不包括中断时间

TSQL -计算两次击打之间的时间,但不包括中断时间
EN

Stack Overflow用户
提问于 2017-10-26 02:27:27
回答 1查看 130关注 0票数 0

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

我需要为劳动力跟踪系统计算打卡和打卡时间。我们的工作人员从上午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这几个“停电”时间内做到这一点呢?

EN

回答 1

Stack Overflow用户

发布于 2017-10-26 03:13:44

此函数返回工作分钟总数。此检查工作时间是否与每个休息时间重叠,然后更改它以指示重叠程度。

然后计算休息的总分钟数,最后减去工人打孔in_out的总时间。

代码语言:javascript
运行
复制
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 

对于某些调试,请执行以下操作:

代码语言:javascript
运行
复制
SELECT * FROM time_off;
SELECT * FROM break_total;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46939626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档