Как запросить разницу в дате между датами одного и того же столбца? - PullRequest
0 голосов
/ 16 марта 2020

У меня есть таблица с полем даты, и мне нужен запрос для возврата идентификатора записей определенного дня.

Пример

ID   UPDATED_DATE
42   31-DEC-19 12.00.00.000000000 AM
43   24-DEC-19 12.00.00.000000000 AM
44   03-DEC-19 12.00.00.000000000 AM
45   18-NOV-19 12.00.00.000000000 AM
46   08-NOV-19 12.00.00.000000000 AM
47   01-NOV-19 12.00.00.000000000 AM
48   26-OCT-19 12.00.00.000000000 AM
49   04-OCT-19 12.00.00.000000000 AM
50   20-SEP-19 12.00.00.000000000 AM

Мне нужен запрос для определите, является ли часть ДНЯ даты> = 1 и <5. </p>

В этом примере в качестве выходных данных я получу идентификатор 44, 47 и 49.

Может кто-нибудь мне помочь для запроса, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Если вы хотите, чтобы разница (согласно исходной версии вопроса ) между днями месяца двух строк составляла от 1 до 4 дней, используйте LAG / LEAD:

SELECT ID,
       UPDATED_DATE
FROM   (
  SELECT ID,
         UPDATED_DATE,
         EXTRACT(DAY FROM updated_date) AS day,
         LAG( EXTRACT(DAY FROM updated_date) )
           OVER ( ORDER BY EXTRACT(DAY FROM updated_date) ) AS prev_day,
         LEAD( EXTRACT(DAY FROM updated_date) )
           OVER ( ORDER BY EXTRACT(DAY FROM updated_date) ) AS next_day
  FROM   table_name
)
WHERE  day - prev_day BETWEEN 1 AND 4
OR     next_day - day BETWEEN 1 AND 4

Какие значения для ваших тестовых данных:

ID | UPDATED_DATE         
-: | :--------------------
47 | 01-NOV-19 12:00:00 AM
44 | 03-DEC-19 12:00:00 AM
49 | 04-OCT-19 12:00:00 AM
46 | 08-NOV-19 12:00:00 AM
45 | 18-NOV-19 12:00:00 AM
50 | 20-SEP-19 12:00:00 AM
43 | 24-DEC-19 12:00:00 AM
48 | 26-OCT-19 12:00:00 AM

Если вы хотите, чтобы день месяца был в диапазоне от 1 до 4, используйте EXTRACT:

SELECT *
FROM   table_name
WHERE  EXTRACT(DAY FROM updated_date) BETWEEN 1 AND 4

Какие выходы:

ID | UPDATED_DATE         
-: | :--------------------
44 | 03-DEC-19 12:00:00 AM
47 | 01-NOV-19 12:00:00 AM
49 | 04-OCT-19 12:00:00 AM

db <> Fiddle здесь

0 голосов
/ 16 марта 2020

Используйте TO_CHAR с соответствующей маской формата:

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

Session altered.

SQL> with test as
  2    (select 42 id, date '2019-12-31' updated_date from dual union all
  3     select 43, date '2019-12-24' from dual union all
  4     select 44, date '2019-12-03' from dual union all
  5     select 45, date '2019-11-18' from dual union all
  6     select 46, date '2019-11-08' from dual union all
  7     select 47, date '2019-11-01' from dual union all
  8     select 48, date '2019-10-26' from dual union all
  9     select 49, date '2019-10-04' from dual union all
 10     select 50, date '2019-09-20' from dual
 11    )
 12  select id, updated_date, to_char(updated_date, 'fmdd') dd
 13  from test
 14  where to_char(updated_date, 'fmdd') >= 1
 15    and to_char(updated_date, 'fmdd') <  5
 16  order by id;

        ID UPDATED_DA DD
---------- ---------- --
        44 03.12.2019 3
        47 01.11.2019 1
        49 04.10.2019 4

SQL>
...