получайте данные ежемесячно между двумя датами в oraclesql

#sql #oracle #datetime

Вопрос:

У меня есть таблица больницы, в которой мне нужно показать расходы пациента с этого месяца по этот месяц . Предположим, у меня есть даты, например, с даты 01/05/2020 и до даты 20/02/2020, мне нужны ежемесячные данные между этими двумя датами, например, с 01 января по 30 января, одни данные и с 1 по 20 февраля. Пожалуйста, предложите какой-нибудь запрос, который я пытаюсь выполнить, но не могу выбрать между двумя датами.

пример набора результатов, который мне нужен :

 MONTH    PT_Expen
----------------
JAN-20    30000
FEB-20     50000
MAR-20     60000
 

это моя структура таблицы

  PT_EXP PT_NAME CREATED_DATE
---------------------------------
 30000  JACK   07/01/2020 
 30000  SWETA  08/01/2020  
 30000  RAM    08/01/2020  
 40000  JOHN   01/02/2020
 60000  SIMON  10/03/2020
 70000  KIRA   11/04/2020
 

ЕСЛИ я дам дату с 1 января и дату с 24 марта,мне понадобятся данные с 1 января по 30 января по одному ,с 1 февраля по 28 февраля по одному, с 1 марта по 24 марта по одному и мой
формат даты: «дд/мм/гггг»

Ответ №1:

Это задание для TRUNC() и ADD_MONTHS().

Функция Oracle TRUNC() работает с метками даты, и они могут быть усечены до ближайшего месяца. То есть, TRUNC('2021-03-20', 'MM') достает тебя 2021-03-01 . Это означает, что вы можете легко выбирать диапазоны месяцев и группировать их по месяцам. В этом примере представлены отчеты о текущем (sysdate) календарном месяце и двух месяцах, предшествующих ему.

 SELECT TRUNC(datestamp, 'MM') AS month_beginning,
       patient,
       SUM(payment) AS total_payment,
       COUNT(*) AS number_of_payments
  FROM my_table 
 WHERE datestamp >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -2)
   AND datestamp <  ADD_MONTHS(TRUNC(SYSDATE, 'MM'), 1)
 GROUP BY patient, TRUNC(datestamp, 'MM')
 ORDER BY patient, TRUNC(datestamp, 'MM')
 

Отредактируйте, если вы хотите указать начальную дату и конечную дату и получить все месяцы, содержащие эти даты, а также месяцы между ними, используйте это.

 SELECT TRUNC(datestamp, 'MM') AS month_beginning,
       patient,
       SUM(payment) AS total_payment,
       COUNT(*) AS number_of_payments
  FROM my_table 
 WHERE datestamp >= TRUNC(start_date, 'MM')
   AND datestamp <  ADD_MONTHS(TRUNC(end_date, 'MM'), 1)
 GROUP BY patient, TRUNC(datestamp, 'MM')
 ORDER BY patient, TRUNC(datestamp, 'MM')
 

Комментарии:

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

2. Смотрите мою правку. При всем уважении, я настоятельно рекомендую вам попытаться выяснить, чего именно вы хотите и как это сделать. Используйте мои примеры в качестве руководства. Но не просто копируйте и вставляйте их. Если вы работаете в магазине Oracle, у вас наверняка есть коллеги, которые могут ознакомиться с вашими требованиями и кодом и помочь вам правильно их сформулировать.

Ответ №2:

Одним из вариантов может быть

 SQL> with your_table (pt_exp, pt_name, created_date) as
  2    (select 30000, 'JACK' , date '2020-01-07' from dual union all
  3     select 30000, 'SWETA', date '2020-01-08' from dual union all
  4     select 30000, 'RAM'  , date '2020-01-08' from dual union all
  5     select 40000, 'JOHN' , date '2020-02-01' from dual union all
  6     select 60000, 'SIMON', date '2020-03-10' from dual union all
  7     select 70000, 'KIRA' , date '2020-04-11' from dual
  8    )
  9  select to_char(created_date, 'yyyy.mm') month,
 10         sum(pt_exp) pt_expen
 11  from your_table
 12  where created_date between date '2020-01-05' and date '2020-02-20'
 13  group by to_char(created_date, 'yyyy.mm')
 14  order by 1;

MONTH     PT_EXPEN
------- ----------
2020.01      90000
2020.02      40000

SQL>
 

Комментарии:

1. Привет @littlefoot я пытался сделать это не так , как ожидалось, но нам нужно показать дату за два месяца, что означает две колонки

2. Я не знаю, чего ты ожидал. Код, который я опубликовал, должен работать; Я отредактировал его, используя примеры данных, которые вы предоставили после того, как я опубликовал исходный код.