夜间工作时间的第一次和最后一次

时间:2018-08-31 14:24:37

标签: postgresql

我有这个问题。

这些是我在样本中拥有的数据(我有更多的人,并且有更多的时间):

CREATE TABLE table_times(id,date_time,name)
AS ( VALUES
    ( 1000004, '2018-08-22 11:11'::timestamp without time zone, 'Carlos Eduardo' ),
    ( 1000004, '2018-08-22 11:43', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-22 11:48', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-22 11:54', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-22 17:52', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-23 08:13', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-23 08:28', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-23 10:25', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-23 10:25', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-23 10:25', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-23 13:30', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-24 22:20', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-24 23:27', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-25 03:14', 'Carlos Eduardo' ),
    ( 1000004, '2018-08-25 05:12', 'Carlos Eduardo' )
);

我正试图找到这个:

id      start              end                  name
-------+-------------------+-------------------+--------------   
1000004 2018-08-22 11:11:00 2018-08-22 17:52:00 Carlos Eduardo
1000004 2018-08-23 08:13:00 2018-08-23 13:30:00 Carlos Eduardo
1000004 2018-08-24 22:20:00 2018-08-25 05:12:00 Carlos Eduardo

我需要按日期整理这些数据,例如22、23天,并整理从晚上开始到早上结束的时间,例如24和25。

我还有其他人,而他们没有特定的劳动时间,那么我需要通过这些数据来获取时间。除此之外,我只有这些数据可以组织,每天最多14个工作小时。

我尝试了以下查询,但是当工作时间是晚上时,它不起作用。

SELECT 
    id, 
    MIN(date_time) AS start, 
    MAX(date_time) AS end, 
    name
FROM
    table_times
GROUP BY 
    id
    , name
    , EXTRACT(DAY FROM date_time)
    , EXTRACT(MONTH FROM date_time)
    , EXTRACT(YEAR FROM date_time)
ORDER BY name, start ASC

有人可以帮助我吗?

PS:对不起,我英语不好。

1 个答案:

答案 0 :(得分:1)

为了使您的问题更容易处理,我们需要定义轮班的界限。在这个答案中,我假设您有两种转变。每天在06:00之后开始并在22:00之前结束的日期偏移通常发生在同一日历天内。夜班从22:00开始,到06:00之前结束,为期两天。

我在下面采用了一种会计技巧,通过该技巧,我将所有夜班时间戳记视为在逻辑上属于同一开始日期。这使我们能够处理您的边界条件。

var str = 'hello, how are you today? I am not bad and you?'

function checker(str) {
  var count = 0
  var count2 = 0
  for (var i = 0; i < str.length; i++) {
    if (str[i] == ",") {
      count++
    } else if (str[i] == "?") {
      count2++
    }
  }
  return `There are ${count} comma(s) and ${count2} question mark(s)`
}
console.log(checker(str));

enter image description here

Demo