【问题标题】:PostgreSQL data from last day evening to morning前一天晚上到早上的PostgreSQL数据
【发布时间】:2022-11-25 05:02:22
【问题描述】:

我有一个包含这种结构和数据的表

Id Data Date Time
1 sample1 2022-11-10 21:10:00
2 sample2 2022-11-10 23:50:00
3 sample3 2022-11-11 01:20:00
4 sample4 2022-11-11 05:30:00
5 sample5 2022-11-11 20:59:00
6 sample6 2022-11-11 23:01:00
7 sample7 2022-11-12 01:01:00
8 sample8 2022-11-12 04:01:00

............................................................ 等等

我想要这样的结构

date Start Date End Date
2022-11-11 21:10:00 05:30:00
2022-11-12 20:59:00 04:01:00

时间不固定,很难弄清楚。一种逻辑是晚上7点到早上8点之后获取数据但不确定。任何建议将不胜感激

【问题讨论】:

  • 抱歉,但我不清楚为什么第 4 行和第 5 行之间应该有一个中断。找到一个描述您需要的算法,您就已经完成了一半的解决方案。
  • @LaurenzAlbe,我相信这是标题中早晚之间的休息时间。所以 05:30:00 是当天早上的最后一个条目,20:59:00 是晚上的第一个条目。话虽这么说,但尚不清楚标记早上和晚上休息时间的实际值是多少。
  • @LaurenzAlbe,不会有任何逻辑,所以在某些情况下,可能有 2 行数据,有时可能有 10 行。这就是为什么我想要晚上 7 点之后的第一个数据作为开始时间,并且可能是早上 8 点之前的最后一个数据作为结束时间

标签: sql postgresql


【解决方案1】:

数据库结构

create table work (id serial, data text, ev_date date, ev_time time);
insert into work(data, ev_date, ev_time) values 
('sample1', '2022-11-10',   '21:10:00'),
('sample2', '2022-11-10',   '23:50:00'),
('sample3', '2022-11-11',   '01:20:00'),
('sample4', '2022-11-11',   '05:30:00'),
('sample5', '2022-11-11',   '20:59:00'),
('sample6', '2022-11-11',   '23:01:00'),
('sample7', '2022-11-12',   '01:01:00'),
('sample8', '2022-11-12',   '04:01:00');

询问

算法如下:

  1. 我们按日期分组
  2. 我们确定间隔-5小时和+8小时
  3. 我们根据顺序查找第一个时间值(-5 小时 - 第一个较大的值,+8 小时 - 第一个较小的值)
  4. 删除空值
    with s as (select ev_date from work group by ev_date),
         p as (select s.ev_date,
         (select work.ev_time from work 
            where (s.ev_date - interval '5 hour')::date = work.ev_date 
                    and ((s.ev_date - interval '5 hour')::time < work.ev_time) 
            order by work.ev_date,work.ev_time limit 1) start_time,
         (select work.ev_time from work 
            where (s.ev_date + interval '8 hour')::date = work.ev_date 
                    and ((s.ev_date + interval '8 hour')::time > work.ev_time) 
            order by work.ev_date,work.ev_time desc limit 1) end_time
         from s)
         select p.ev_date,p.start_time,p.end_time from p where p.start_time is not null and p.end_time is not null order by p.ev_date;
    

    结果

      ev_date   | start_time | end_time
    ------------+------------+----------
     2022-11-11 | 21:10:00   | 05:30:00
     2022-11-12 | 20:59:00   | 04:01:00
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2020-12-01
    • 2014-09-29
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多