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;
但我需要在一段时间内这样做,而不是一次约会。如有任何建议或解决方案,我们将不胜感激。
谢谢,坎南
1条答案
按热度按时间pod7payv1#
假设这是oracle的问题而不是mysql:
我想你要做的第一件事就是计算到期日。我认为一个简单的案例陈述可以帮你解决这个问题:
然后,使用新的到期日字段,您可以检查到期日是否落下
between
所需的日期范围。上面在2018年2月25日和2018年3月12日之间进行的查询检查使用您的数据生成以下输出: