使用给定日期进行动态到期日检查

时间:2018-08-24 11:44:23

标签: mysql sql database datetime

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  

以上是我的表格数据示例。 start_dates将根据时间间隔和期限而过期(即id-1将在start_date之后的2个月后到期,id-2将在3周后到期),反之亦然。 period是(日,周,月,年)的枚举。客户可以指定任何日期。像这样说25-06-2026至13-07-2026。我必须返回到期日期在该期限内的ID。我希望我能明确我的问题。

这是我为解决此问题所做的工作。我正在使用mysql 5.7。我找到了使用递归CTE实现此目标的方法。(在mysql 5.7中不可用)。并且有一种方法可以通过使用内联子查询以及联合及其性能杀手来填充虚拟记录来实现此目的,并且记录的数量受到限制。(例如链接Generating a series of dates中给出的)指向获取单个日期的结果非常容易。以下是我的查询(在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;

但是我需要一段时间而不是单个日期。任何建议或解决方案将不胜感激。

谢谢, 坎南

1 个答案:

答案 0 :(得分:1)

假设这是一个Oracle问题,而不是MySQL:

我认为您需要做的第一件事是计算到期日。我认为一个简单的case语句可以为您解决这个问题:

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

然后,使用该新的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'

上面的查询检查在2/25/18和3/12/18之间使用您的数据产生以下输出:

+----+-------------+----------+--------+-------------+
| 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 |
+----+-------------+----------+--------+-------------+