4
我有一個月和一天;我正在嘗試計算在給定日期之後,這個月和那天將存在的下一個日期。計算下一個日期/月份組合將發生
例如,如果我有一個表如下,其中reference_date的格式爲'MMDD'
。請不要爲此責怪我;這是在英國提交的官方格式。
create table tmp_ben_dates (filing_date date, reference_date varchar2(4));
insert all
into tmp_ben_dates values (to_date('31/12/2011','dd/mm/yyyy'), '1231')
into tmp_ben_dates values (to_date('31/12/2011','dd/mm/yyyy'), '1130')
into tmp_ben_dates values (to_date('31/12/2011','dd/mm/yyyy'), '0101')
into tmp_ben_dates values (to_date('31/07/2011','dd/mm/yyyy'), '0601')
into tmp_ben_dates values (to_date('31/07/2011','dd/mm/yyyy'), '0801')
select * from dual;
我想返回每個reference_date
每個filing_date
後發生的第一次約會。例如在第一個例子中,這將是2012年12月31日,最後是01/08/2011。
我最好的嘗試,到目前爲止,如下
with new_date as (
select reference_date
, filing_date
, add_months(trunc(filing_date,'y')
, to_number(substr(reference_date,1,2)) - 1)
+ to_number(substr(reference_date,3)) - 1 as the_date
from tmp_ben_dates
)
select filing_date
, reference_date
, case when filing_date < the_date then next_date
else add_months(the_date,12) end
from new_date
它返回正確的結果:
FILING_DATE REFE NEXT_DATE
------------------- ---- -------------------
31/12/2011 00:00:00 1231 31/12/2012 00:00:00
31/12/2011 00:00:00 1130 30/11/2012 00:00:00
31/12/2011 00:00:00 0101 01/01/2012 00:00:00
31/07/2011 00:00:00 0601 01/06/2012 00:00:00
31/07/2011 00:00:00 0801 01/08/2011 00:00:00
然而,它也完全荒謬的;難以閱讀和理解。
它也可以使用interval
但我真的不知道它是如何讓它更容易混淆,以確定發生了什麼。
with new_date as (
select reference_date
, filing_date
, trunc(filing_date,'y')
+ to_yminterval('P'
|| to_char(to_number(substr(reference_date,1,2)) - 1)
|| 'M')
+ to_dsinterval('P'
|| to_char(to_number(substr(reference_date,3)) - 1)
|| 'D') as the_date
from tmp_ben_dates
)
select filing_date
, reference_date
, case when filing_date < the_date then the_date
else add_months(the_date,12) end as next_date
from new_date
有什麼真正明顯的,我在這裏失蹤?在SQL中有這樣一個簡單的方法嗎?
這絕對簡單一些;我完全忘記了我可以這樣做,因爲我通常避免使用日期進行字符串操作。 – Ben 2012-08-16 09:51:30