【问题标题】:SQL Server : get start time and end time with in the multiple night shiftSQL Server:在多个夜班中获取开始时间和结束时间
【发布时间】:2017-12-12 22:09:07
【问题描述】:

如何获取此列表的开始和结束时间?我可以将日期添加到这个时间,并且可以得到最小值和最大值,但你可以看到 row 3 有下一天班,但它会在同一日期下,因为它是夜班

我已经添加了正常的白班员工也得到了正确的逻辑

EmployeeId  ShiftDate   ShiftStartTime  ShiftEndTime
-----------------------------------------------------
20040       2017-11-01  21:00:00        23:00:00
20040       2017-11-01  23:00:00        00:30:00
20040       2017-11-01  00:30:00        06:00:00
20124       2017-11-01  09:00:00        16:30:00
20124       2017-11-01  16:30:00        22:00:00
20124       2017-11-01  22:00:00        22:30:00

我需要它,如下所示:

EmployeeId  ShiftDate   ShiftStartTime  ShiftEndTime
----------------------------------------------------
20040       2017-11-01  21:00:00        06:00:00
20124       2017-11-01  09:00:00        22:30:00

【问题讨论】:

  • 那里有一些令人抓狂的数据。如果他们分班工作会发生什么。就像他们早上进来工作几个小时,离开然后晚上回来工作几个小时,一直持续到第二天?时间是否总是像这样与同一 shiftdate 上的其他记录相关联?
  • 请注明轮班开始的“实际日期”...不要添加员工来过滤列表 - 请将完整列表添加到您的问题中
  • @Grantly 我没有关注(我也不是 OP,所以也许这是有道理的,我只是不明白)。您认为这里的Actual date 是什么。如果这些数据不可用怎么办? “不要添加员工来过滤列表”是什么意思。 “您的问题的完整列表”是什么意思?
  • @JNevill Actaul 的日期是早班,从晚上 11:30 开始,直到第二天早上 8:30……早班很容易被认为是“运行”第二天(当班次结束时)。因此,所有行政报告/薪水等都将基于实际日期。一个班次只能有一个日期,因此总是有业务规则(好的或坏的)来规定这一点。将员工链接到列表并不一定会使列表更相关、更完整或更有帮助......它只会增加另一个潜在的错误......完整的数据列表(如果不是太大的话)要好得多
  • @JNevill 如果您以我上面的早班示例为例,那么当您告诉您的员工在 2000 年 1 月 1 日晚上 11:30 来上班时,请注意复杂性......但是他的 SHIFT工作(写在他的工资支票上)是 2000 年 2 月 1 日(英国日期)的早班。因此,企业必须非常清楚实际和“报告”轮班日期 - 否则员工可能会迟到一天

标签: sql sql-server


【解决方案1】:

在商业环境中,我们通过在每个班次上附加一个 FLAG 来解决这个问题。该标志将指示班次的“报告日期”...如果“报告/管理日期”是“下一个”日,则该标志的值为 1。 0 为同一天。 -1 表示前一天(我们从未使用过……取决于您的情况)

我修改了您的表格以显示一个可能的 SHIFTS 表格,我猜该表格也应该有一个 NAME 列(例如早上、下午、白天、夜班等)

ReportFlag ShiftStartTime  ShiftEndTime
1         21:00:00        23:00:00
1         23:00:00        00:30:00
0         00:30:00        06:00:00
0         09:00:00        16:30:00
0         16:30:00        22:00:00
1         22:00:00        22:30:00

注意我是如何添加 1 的 - 表示“这个转变”实际上被认为是在“下一个”。

然后您也可以使用标志值 0,1 在查询中添加 DATE 函数

【讨论】:

  • 这里报告日期是明确的报告日期是2017-11-01
  • 然后你的“实际”日期是什么时候。它们不可能总是相同的(现实生活中的转变)
  • 您可以使用我的技术从报告日期或其他方式中找到实际日期。它很有活力
  • 问题是班次开始和结束时间列没有日期所有班次都需要在同一日期
  • 这是一个现实生活中的问题,它已在实际系统中使用,但我们正在尝试生成报告并卡住了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
相关资源
最近更新 更多