반응형
쿼리를 사용하여 주어진 두 날짜 사이의 월 목록을 얻는 방법은?
저는 2011년 3월 28일과 6월 29일 두 번의 데이트가 있습니다.나는 이 두 날짜 사이의 달을 표시할 sql 쿼리가 필요합니다. 즉, 날짜가 포함된 달을 포함합니다.6월, 5월, 4월, 3월.
이런 거.
SQL> ed
Wrote file afiedt.buf
select to_char( add_months( start_date, level-1 ), 'fmMonth' )
from (select date '2011-03-30' start_date,
date '2011-06-29' end_date
from dual)
connect by level <= months_between(
trunc(end_date,'MM'),
trunc(start_date,'MM') )
* + 1
SQL> /
TO_CHAR(ADD_MONTHS(START_DATE,LEVEL-
------------------------------------
March
April
May
June
효과가 있을 겁니다
다른 솔루션보다 훨씬 깨끗하다고 생각하기 때문에 이 솔루션을 추가할 것입니다.
SELECT ADD_MONTHS(TRUNC(TO_DATE('28-Mar-2011', 'DD-MON-YYYY'), 'MON'), ROWNUM - 1) date_out
FROM DUAL
CONNECT BY ADD_MONTHS(TRUNC(TO_DATE('28-Mar-2011', 'DD-MON-YYYY'), 'MON'), ROWNUM - 1)
<= TRUNC(TO_DATE('29-Jun-2011', 'DD-MON-YYYY'), 'MON')
MONTH_BETWENT 기능을 사용하실 수 있습니다.
SELECT MOD( TRUNC( MONTHS_BETWEEN( '2011-07-29', '2011-03-28' ) ), 12 ) as MONTHS
FROM DUAL
산출량
MONTHS
----------
4
며칠 전에 이 문제에 대한 답이 필요했습니다.더 마음에 드는 또 다른 솔루션을 찾았습니다.
select to_char(which_month, 'Mon-yyyy') month
from
(
select
add_months(to_date(:start_date,'mm-yyyy'), rownum-1) which_month
from
all_objects
where
rownum <= months_between(to_date(:end_date,'mm-yyyy'), add_months(to_date(:start_date,'mm-yyyy'), -1))
order by
which_month
)
물론 당신이 원하는 어떤 형식이든 사용할 수 있습니다.저는 그들이 성과가 없을 때도 몇 달을 받을 수 있도록 다른 세트를 '연합'하고 요약했습니다.
SELECT MIN (to_date((TO_CHAR (Actual_Date, 'DD-MM-RRRR')),'dd-mm-rrrr')) F_DATE,
MAX (to_date((TO_CHAR (Actual_Date, 'DD-MM-RRRR')),'dd-mm-rrrr')) T_DATE,
TO_CHAR (Actual_Date, 'MM-RRRR') TRX_MONTH
FROM ( SELECT TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr')) + LEVEL - 1
Actual_Date
FROM (SELECT TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr'), 'MM') - 1
AS dt
FROM DUAL)
CONNECT BY LEVEL <=
( TO_DATE (:P_TDATE, 'dd-mm-rrrr')
- TRUNC (TO_DATE (:P_FDATE, 'dd-mm-rrrr'))
+ 1))
GROUP BY TO_CHAR (Actual_Date, 'MM-RRRR')
ORDER BY 1
declare
v_date_from_first_day date;
v_date_to_last_day date;
v_month_name varchar2(10);
v_month_number number;
v_year_number number;
v_month_diff number;
begin
v_date_to_last_day := to_date('31.12.2018');
v_date_from_first_day := to_date('01.01.2018');
select months_between(v_date_to_last_day,v_date_from_first_day) as diff into v_month_diff from dual;
for i in 1..round(v_month_diff, 2) loop
select
to_char(trunc(add_months(v_date_to_last_day - months_between(v_date_from_first_day, v_date_to_last_day), -i)), 'fmMonth') as month_nm,
to_char(trunc(add_months(v_date_to_last_day - months_between(v_date_from_first_day, v_date_to_last_day), -i)), 'MM') as month_num,
to_char(trunc(add_months(v_date_to_last_day - months_between(v_date_from_first_day, v_date_to_last_day), -i)), 'YYYY') as year_num
into v_month_name, v_month_number, v_year_number
from dual;
dbms_output.put_line(v_month_number || '/' || v_year_number);
dbms_output.put_line(v_month_name || '/' || v_year_number);
end loop;
end;
Output:
12/2018
11/2018
10/2018
9/2018
8/2018
7/2018
6/2018
5/2018
4/2018
3/2018
2/2018
1/2018
여기, 달 이름은 크로아티아어로 되어 있습니다.
Prosinac/2018
Studeni/2018
Listopad/2018
Rujan/2018
Kolovoz/2018
Srpanj/2018
Lipanj/2018
Svibanj/2018
Travanj/2018
Ožujak/2018
Veljača/2018
Siječanj/2018
언급URL : https://stackoverflow.com/questions/6926923/how-to-get-a-list-of-months-between-2-given-dates-using-a-query
반응형
'programing' 카테고리의 다른 글
| Fancybox: Android 전화기에서 스크롤할 수 없습니다. (0) | 2023.10.21 |
|---|---|
| '스크롤 보기를 자동으로 조정합니다.'Insets'는 iOS 11.0에서 더 이상 사용되지 않습니다. (0) | 2023.10.21 |
| 코드 사인 오류: 프로비저닝 프로파일을 찾을 수 없습니다. (0) | 2023.10.21 |
| 스프링 JSP MVC와 Tymeleaf MVC의 차이 (0) | 2023.10.21 |
| 사용자 정의 유형에 대한 정보를 얻는 방법은 무엇입니까? (0) | 2023.10.21 |