我有这个问题。
这些是我在样本中拥有的数据(我有更多的人,并且有更多的时间):
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:对不起,我英语不好。
答案 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));