【问题标题】:How to compute extra pay in night shifts and on sundays如何计算夜班和周日的额外工资
【发布时间】:2011-06-17 08:42:00
【问题描述】:

我在 MySQL 中做了一个表格,以 datetime 类型存储工作班次的开始和结束时间。我需要从它们中计算两件事(在 MySQL 中)。首先,某人在晚上 10 点到早上 6 点之间的某个班次中工作了多少分钟,以及某人在周日工作了多少分钟。星期天应该优先于那些晚上的时间,并且不应该把那些星期天的早晨计算两次。

提前谢谢你。

D.

顺便说一句,我试过了,但没用:

SELECT *,
IF(DAYNAME(start)=DAYNAME(end),
    IF(TIME(start)<='6:00:00' AND TIME(end)<='6:00:00',TIME(end)-TIME(start),
        IF(TIME(start)>='22:00:00' AND TIME(end)>='22:00:00',TIME(end)-TIME(start),
            IF(TIME(start)>='6:00:00' AND TIME(end)<='22:00:00',0,
                IF(TIME(start)<='6:00:00' AND TIME(end)<='22:00:00','6:00:00'-TIME(start),
                    IF(TIME(start)>='6:00:00' AND TIME(end)>='22:00:00',TIME(end)-'22:00:00',NULL)
                    )
                )
            )
        ),
    IF(TIME(start)<='22:00:00' AND TIME(end)<='6:00:00','2:00:00'+TIME(end),
        IF(TIME(start)<='22:00' AND TIME(end)>='6:00:00','8:00:00',
            IF(TIME(start)>='22:00:00' AND TIME(end)<='6:00:00','24:00:00'-TIME(start)+TIME(end),
                IF(TIME(start)>='22:00:00' AND TIME(end)>='6:00:00','24:00:00'-TIME(start)+'6:00:00',NULL)
                )
            )
        )
    ) AS ExtraTime FROM `work`

【问题讨论】:

  • 您使用什么编程语言向 MySQL 发送查询?广告@m
  • 目前没有。我想在 MySQL 中做到这一点。但如果没有简单的解决方案,PHP 也可以。

标签: mysql datetime calendar shift overlapping


【解决方案1】:

工作分钟数:

SELECT TIMESTAMPDIFF(MINUTE, `start_time`, `end_time`) FROM ... WHERE DAYOFWEEK(`start_time`) != 1

周日工作时间:

SELECT TIMESTAMPDIFF(MINUTE, `start_time`, `end_time`) FROM ... WHERE DAYOFWEEK(`start_time`) = 1

【讨论】:

  • 如果换班真的从晚上 10 点开始,那就太好了。但实际上它从晚上 9 点 45 分开始,到下午 6 点 15 分结束。或者从凌晨 2:55 开始,到上午 11:05 结束。晚上 10 点到早上 6 点之间的时间将乘以 1.25。同样,周日的那些也将乘以 1.25。但两者都不是。
  • @MDV:我不确定我是否遵循您的要求;我不明白其中的逻辑。如果您想检查夜班,我假设您的数据库中可能有一些标志。如果没有,您可以执行 WHERE `start_time` &gt; '21:00:00 00:00:00' 之类的操作。上面的查询为您提供了一些开始,我认为您可能会尝试在其上构建一些逻辑。如果它不起作用,请随时在 SO 上分享您的查询;社区将乐于提供帮助。
  • 你能看到我试图用大量的 IF 做什么吗?但是,它并没有按应有的方式工作。如果你能看看会有所帮助。
【解决方案2】:

在 PHP 中,试试这段代码(警告:它尚未经过测试):

<?php
$regularPay = 100; //100 dollars a day
$weekendPay = $regularPay + ($regularPay / 2); //150 dollars over weekend
$link = mysqli_connect("localhost","username","password");
mysqli_select_db("dbname");
$pay = date("w")==0 or date("w")==6 ? $weekendPay : $regularPay; //0=Sun, 6=Sat
$query = mysqli_query($link,"INSERT INTO pay SET employee='John Smith',pay='$pay'");
?>

只需将字符串替换为适合您计算机的值即可。

广告@m。

【讨论】:

  • 很抱歉,但这并没有真正的帮助。轮班很少同时开始和结束,但公司需要在周日额外支付 25%,在晚上 10 点至早上 6 点之间额外支付 25%——无论何时开始工作。但是,不能组合附加功能。
  • @MDV 抱歉,我帮不上忙……我不太擅长计算数学变化……:/ Ad@m
  • 谢谢。我想我在这种事情上也比较松散。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多