#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. Я не знаю, чего ты ожидал. Код, который я опубликовал, должен работать; Я отредактировал его, используя примеры данных, которые вы предоставили после того, как я опубликовал исходный код.