繁体   English   中英

如何找到日期后的下一个Xth

[英]How to find next Xth of month after a date

我有两个参数:

  1. 日期(例如:22/11/2016)
  2. 天数(例如:25)

我想找到2016年11月22日之后的下一个月25日: 25/11/2016月25日

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

trunc(date '2016-11-22', 'month')将返回该月的第一天,然后+ 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 

它可以解决您的问题:

 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;

您可以使用

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

LAST_DAY会给您最后一个给予日期,即几个月(11月30日,即11月30日),然后加上1天即可得出12月1日,再加上您的天数。

你可以用这个

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'

这是一种方法:

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

它的作用是,首先通过将您所要的日期与要比较的日期进行比较,从而找出新日期将在的月份。 (即,如果您要到达的日期的日期已经超过开始日期的日期,则在月份中加1,否则不添加任何内容)。

一旦有了,只需添加您想要达到的天数即可。

我假设如果该月没有完整的天数(例如,2月,4月,6月,9月,11月),那么您将需要该月的最后一天。

因此,我们将选择较低的一个-月的最后一天或您想去的那一天。 我们必须从该结果中减去一个,因为我们想将月份的第一天包括在内。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM