2016-11-22 15 views

回答

1
select trunc(date '2016-11-22', 'month') + 25 
from dual; 

trunc(date '2016-11-22', 'month')將返回第一個月份,T他+ 25然後將添加所需的25天。

如果第二個參數的含義依賴於「比較」的日期,你可以做這樣的事情:

select case 
      when extract(day from date '2016-11-22') >= 25 then 
      add_months(trunc(date '2016-11-22', 'month'), 1) + 25 
      else trunc(date '2016-11-22', 'month') + 25 
     end as next_date 
from dual; 

當然,你將取代硬編碼值的日期和天的「數」包含變量或列值。

這個例子:

with sample_data (the_date, num_days) as (
    select date '2016-11-22', 25 from dual union all 
    select date ' 2016-11-26', 22 from dual union all 
    select date ' 2016-11-26', 3 from dual 
) 
select the_date, num_days, 
     case 
      when extract(day from the_date) >= num_days then 
      add_months(trunc(the_date, 'month'), 1) + num_days - 1 
      else trunc(the_date, 'month') + num_days - 1 
     end as next_date 
from sample_data; 

將返回:

THE_DATE | NUM_DAYS | NEXT_DATE 
------------+----------+------------ 
2016-11-22 |  25 | 2016-11-25 
2016-11-26 |  22 | 2016-12-22 
2016-11-26 |  3 | 2016-12-03 
+0

但是如果我的日期是2016年11月22日,我想要下個月的第三個月(03/12/2016)? – Zedfax

+0

不是正確的答案。如果輸入是2016-11-26,則輸出應該是2016-12-25。 Zedfax - 請驗證。 – Ubercool

+0

看起來像你的日期'22/11/2016'是固定的,你想要的所有日期之後,那裏就不可能有通用的解決方案。您需要扭轉並將您的查詢變爲您想要的日期 – XING

0

您可以使用

LAST_DAY(<<a date>>) + <<a day number>> + 1 

LAST_DAY給你給的最後一天,月(EI月,30日) ,然後加1天得到12月1日加上你的日數。

+1

這將產生12月25日的問題樣本數據。 –

+0

是的,但正如已經注意到的那樣,問題並不十分清楚。 –

0

您可以使用此

WITH tmp AS 
(
    SELECT TO_DATE('22/11/2016', 'DD/MM/YYYY') date_col FROM DUAL 
) 
SELECT 
    CASE WHEN TO_CHAR(date_col,'DD') > '25' 
     THEN TO_DATE('25' || TO_CHAR(ADD_MONTHS(date_col, 1), '/MM/yyyy'), 'DD/MM/YYYY') 
     ELSE TO_DATE('25' || TO_CHAR(date_col, '/MM/yyyy'), 'DD/MM/YYYY') END date_col_new 
FROM tmp; 

如果輸入(25)號,你可以使用TO_CHAR(your_input)代替'25'

1

它可以解決你的問題:

select 
    (
    case 
     when trunc (:yourdate-trunc(:yourdate,'month'))+1 <:urNum then 
     trunc(:yourdate,'month')+:urNum-1 
     else 
     trunc(last_day(:yourdate))+:urNum 
      end) 
     from dual; 
0

這裏有一個方式:

WITH dates AS (SELECT to_date('30/11/2015', 'dd/mm/yyyy') dt FROM dual UNION ALL 
       SELECT to_date('03/11/2015', 'dd/mm/yyyy') dt FROM dual UNION ALL 
       SELECT to_date('31/10/2015', 'dd/mm/yyyy') dt FROM dual UNION ALL 
       SELECT to_date('29/11/2015', 'dd/mm/yyyy') dt FROM dual UNION ALL 
       SELECT to_date('31/01/2016', 'dd/mm/yyyy') dt FROM dual), 
     dom AS (SELECT 25 day_of_month FROM dual UNION ALL 
       SELECT 31 day_of_month FROM dual UNION ALL 
       SELECT 30 day_of_month FROM dual UNION ALL 
       SELECT 03 day_of_month FROM dual UNION ALL 
       SELECT 01 day_of_month FROM dual), 
     res AS (SELECT dates.dt starting_dt, 
         dom.day_of_month, 
         add_months(TRUNC(dates.dt, 'mm'), 
           CASE WHEN to_char(dates.dt, 'dd') >= dom.day_of_month 
              THEN 1 
             ELSE 0 
           END) month_of_end_dt 
       FROM dates 
         CROSS JOIN dom) 
SELECT starting_dt, 
     day_of_month, 
     month_of_end_dt + least(day_of_month, to_number(to_char(last_day(month_of_end_dt), 'dd'))) - 1 next_date 
FROM res 
ORDER BY starting_dt, day_of_month; 

STARTING_DATE DAY_OF_MONTH NEXT_DATE 
------------- ------------ ---------- 
31/10/2015    1 01/11/2015 
31/10/2015    3 03/11/2015 
31/10/2015    25 25/11/2015 
31/10/2015    30 30/11/2015 
31/10/2015    31 30/11/2015 
03/11/2015    1 01/12/2015 
03/11/2015    3 03/12/2015 
03/11/2015    25 25/11/2015 
03/11/2015    30 30/11/2015 
03/11/2015    31 30/11/2015 
29/11/2015    1 01/12/2015 
29/11/2015    3 03/12/2015 
29/11/2015    25 25/12/2015 
29/11/2015    30 30/11/2015 
29/11/2015    31 30/11/2015 
30/11/2015    1 01/12/2015 
30/11/2015    3 03/12/2015 
30/11/2015    25 25/12/2015 
30/11/2015    30 30/12/2015 
30/11/2015    31 30/11/2015 
31/01/2016    1 01/02/2016 
31/01/2016    3 03/02/2016 
31/01/2016    25 25/02/2016 
31/01/2016    30 29/02/2016 
31/01/2016    31 29/02/2016 

這是做什麼的,它首先通過比較你之後的日子和被比較的日期來發現新的日期。 (例如,如果您想要到達的日期的日期已經超過開始日期的那一天,則在該月份中添加一個,否則不添加任何內容)。

一旦你有了這個,這是一個簡單的事情,你可以添加你試圖去的天數。

我假設如果月份沒有完整的天數(例如,二月,四月,六月,九月,十一月),那麼你會希望無論那個月的最後一天是什麼。

因此,我們會選取較低者 - 月份的最後一天或您想要到達的那一天。我們必須從該結果中減去一個,因爲我們希望將該月的第一個包括在計數中。

相關問題