使用给定的日期周期检查动态到期日期

pobjuy32  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(260)
id  start_date  interval  period
1   1/22/2018   2         month 
2   2/25/2018   3         week  
3   11/24/2017  3         day   
4   7/22/2017   1         year  
5   2/25/2018   2         week

上面是我的表格数据示例。开始日期将根据时间间隔和期限到期(即id-1的到期日为开始日期后2个月,id-2的到期日为3周,反之亦然)。期间是(日、周、月、年)的枚举。客户可以给出任何期限的日期。比如说2026年6月25日到2026年7月13日。。我得把到期日在那个期限内的证件还给你,希望我把问题说清楚。
这是我为解决这个问题所做的。我正在使用MySQL5.7。我找到了通过递归cte实现这一点的方法(在MySQL5.7中不可用)。有一种方法可以实现这一点,通过使用内联子查询以及联合来填充虚拟记录,这是一个性能杀手,而且记录的填充受到限制(就像在生成一系列日期的链接中给出的那样),我已经达到了一个点,可以很容易地获得单个日期的结果。下面是我的查询(在oracle中)

select id 
   from (select a.*,
           case 
           when period='week' 
           then mod((to_date('22-07-2018','dd-mm-yyyy')-start_date),7*interval)  
           when period='month' and to_char(to_date('22-07-2018','dd-mm-yyyy'),'dd')=to_char(start_date,'dd') 
                and mod(months_between(to_date('22-07-2018','dd-mm-yyyy'),start_date),interval)=0 
            then 0
            when period='year' and to_char(to_date('22-07-2018','dd-mm-yyyy'),'dd-mm')=to_char(start_date,'dd-mm') 
             and mod(months_between(to_date('22-07-2018','dd-mm-yyyy'),start_date)/12,interval)=0 
            then 0 
            when period='day' 
             and mod((to_date('22-07-2018','dd-mm-yyyy')-start_date),interval)=0 
            then 0 else 1 end filter from kml_subs a) 
            where filter=0;

但我需要在一段时间内这样做,而不是一次约会。如有任何建议或解决方案,我们将不胜感激。
谢谢,坎南

pod7payv

pod7payv1#

假设这是oracle的问题而不是mysql:
我想你要做的第一件事就是计算到期日。我认为一个简单的案例陈述可以帮你解决这个问题:

case when period = 'day' then start_date + numtodsinterval(interval,period)
     when period = 'week' then start_date + numtodsinterval(interval*7,'day')
     when period = 'month' then add_months(start_date,interval)
     when period = 'year' then add_months(start_date,interval*12)
end due_date

然后,使用新的到期日字段,您可以检查到期日是否落下 between 所需的日期范围。

select *
from(
select id,
       start_date,
       interval,
       period,
       case when period = 'day' then start_date + numtodsinterval(interval,period)
            when period = 'week' then start_date + numtodsinterval(interval*7,'day')
            when period = 'month' then add_months(start_date,interval)
            when period = 'year' then add_months(start_date,interval*12)
            else null end due_date
from data)
where due_date between date '2018-02-25' and date '2018-03-12'

上面在2018年2月25日和2018年3月12日之间进行的查询检查使用您的数据生成以下输出:

+----+-------------+----------+--------+-------------+
| id | start_date  | interval | period |  due_date   |
+----+-------------+----------+--------+-------------+
|  2 | 05-FEB-2018 |        3 | week   | 26-FEB-2018 |
|  5 | 25-FEB-2018 |        2 | week   | 11-MAR-2018 |
+----+-------------+----------+--------+-------------+

相关问题