У меня есть одно требование, где я должен показывать записи между определенной датой и временем каждый день одной недели - PullRequest
1 голос
/ 13 апреля 2019

У меня есть одно требование, в котором я должен показывать записи между определенной датой и временем каждый день в течение одной недели.в течение одной недели (с 2019-04-01 по 2019-04-06), например запись 2019-04-01 с 19:00 до 8:00 2019-04-02 и запись 2019-04-02 в 19До 08:00 2019-04-03 и ... не могли бы вы мне помочь!

Ответы [ 4 ]

0 голосов
/ 15 апреля 2019

Используйте рекурсивный запрос для создания правильных периодов, затем присоединитесь к вашим данным или упростите с условием, как здесь:

select callbegin, callerno 
  from table4 
  where callerno in ('7032','750')
    and callbegin between timestamp '2019-04-01 19:00:00' 
                      and timestamp '2019-04-06 08:00:00'
    and ('19' <= to_char(callbegin, 'hh24') or to_char(callbegin, 'hh24') < '08');

демо

0 голосов
/ 13 апреля 2019

Вот как я понял вопрос.

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi';

Session altered.

SQL> break on period;
SQL> with
  2  data (id, datum) as
  3    (select 1, to_date('01.04.2019 15:30', 'dd.mm.yyyy hh24:mi') from dual union all
  4     select 2, to_date('01.04.2019 20:00', 'dd.mm.yyyy hh24:mi') from dual union all -- 1st
  5     select 3, to_date('02.04.2019 01:15', 'dd.mm.yyyy hh24:mi') from dual union all -- 1st perios
  6     select 4, to_date('02.04.2019 11:00', 'dd.mm.yyyy hh24:mi') from dual union all
  7     select 5, to_date('02.04.2019 23:15', 'dd.mm.yyyy hh24:mi') from dual union all -- 2nd period
  8     select 6, to_date('03.04.2019 00:10', 'dd.mm.yyyy hh24:mi') from dual union all -- 2nd
  9     select 7, to_date('04.04.2019 22:20', 'dd.mm.yyyy hh24:mi') from dual           -- 3rd period
 10    ),
 11  test as
 12    (select date '2019-04-01' dstart,
 13            date '2019-04-06' dend
 14     from dual
 15    ),
 16  inter as
 17    (select dstart + level - 1 datum
 18     from test
 19     connect by level <= dend - dstart + 1
 20    ),
 21  from_to as
 22    (select datum + 19/24 date_from,
 23            lead(datum) over (order by datum) + 8/24 date_to
 24     from inter
 25    )
 26  select f.date_From ||' - '|| f.date_to period,
 27         d.id,
 28         d.datum
 29  from data d join from_to f on 1 = 1
 30  where d.datum between f.date_from and f.date_to
 31  order by f.date_From, d.id;

PERIOD                                      ID DATUM
----------------------------------- ---------- ----------------
01.04.2019 19:00 - 02.04.2019 08:00          2 01.04.2019 20:00
                                             3 02.04.2019 01:15
02.04.2019 19:00 - 03.04.2019 08:00          5 02.04.2019 23:15
                                             6 03.04.2019 00:10
04.04.2019 19:00 - 05.04.2019 08:00          7 04.04.2019 22:20

SQL>
0 голосов
/ 15 апреля 2019

Спасибо за ваш добрый ответ, я использовал такой же способ и получил ответ, но я хочу упростить его.(Мне нужна информация за 7 дней до этого)

select t.callbegin,t.callerno  from table4 t
       where   t.callbegin >= to_date(sysdate -7) +19/24 and
                t.callbegin  < to_date (sysdate-6)+ 8/24       
       and t.calleeno in ('7032','750')
       union
       select t.callbegin,t.callerno from table4 t
         where   t.callbegin >= to_date(sysdate -6) +19/24 and
                t.callbegin  < to_date (sysdate-5)+ 8/24       

       and t.calleeno in ('7032','750') 
       union
       select t.callbegin,t.callerno  from table4 t
       where   t.callbegin >= to_date(sysdate -5) +19/24 and
                t.callbegin  < to_date (sysdate-4)+ 8/24                       
       and t.calleeno in ('7032','750')

       union
       select t.callbegin,t.callerno  from table4 t
       where   t.callbegin >= to_date(sysdate -4) +19/24 and
                t.callbegin  < to_date (sysdate-3)+ 8/24                       
       and t.calleeno in ('7032','750')
       union
       select t.callbegin,t.callerno  from table4 t
       where   t.callbegin >= to_date(sysdate -3) +19/24 and
                t.callbegin  < to_date (sysdate-2)+ 8/24                       
       and t.calleeno in ('7032','750')
       union
       select t.callbegin,t.callerno  from table4 t
       where   t.callbegin >= to_date(sysdate -2) +19/24 and
                t.callbegin  < to_date (sysdate-1)+ 8/24                       
        and t.calleeno in ('7032','750')
       union
       select t.callbegin,t.callerno  from table4 t
       where   t.callbegin >= to_date(sysdate -1) +19/24 and
                t.callbegin  < to_date (sysdate)+ 8/24                       
       and t.calleeno in ('7032','750')
0 голосов
/ 13 апреля 2019

Как отфильтровать данные по дням и времени по одной неделе:

With date_list as (
   Select 
      to_date(to_char( (sysdate - level), 'yyyymmdd') || '19', 'yyyymmddhh24') begin_time, 
      to_date(to_char( ((sysdate - level)+1), 'yyyymmdd') || '08', 'yyyymmddhh24') end_time
   From dual connect by level <= 7
)
Select begin_time, your_table.*
From 
   your_table t1, 
   date_list t2
Where 
   t1.your_date between t2.begin_time and t2.end_time;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...