单个查询中的动态到期日查找器

时间:2018-09-24 11:33:36

标签: mysql date datetime

id  start_date  interval  period
1   2018-01-22   2         month 
2   2018-02-25   3         week  
3   2017-11-24   3         day   
4   2017-07-22   1         year  
5   2018-02-25   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中不可用)。并且有一种方法可以通过使用内联子查询和联合来填充虚拟记录来实现此目的,但这是一个性能杀手,我们无法在每次客户端请求到来时都填充虚拟记录。(如链接{{3 }})我已经很容易获得单个日期的结果。以下是我的查询。

  SELECT b.* 
FROM   (SELECT a.*, 
               CASE 
                 WHEN period = 'week' THEN MOD(Datediff('2018-07-22', start_date), 7 * intervals) 
                 WHEN period = 'month' 
                      AND Day('2018-07-22') = Day(start_date) 
                      AND MOD(Period_diff(201807, Extract(YEAR_MONTH FROM start_date)), intervals) = 0 THEN 0
                 WHEN period = 'year' 
                      AND Day('2018-07-22') = Day(start_date) 
                      AND MOD(Period_diff(201807, Extract( 
                              YEAR_MONTH FROM start_date)) / 12, 
                          intervals) = 0 THEN 0 
                 WHEN period = 'day' THEN MOD(Datediff('2018-07-22', start_date) , intervals) 
               end filters 
        FROM   kml_subs a)b 
WHERE  b.filters = 0;

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

My desired result shoud be like..

if i give two dates.say 2030-05-21 & 2030-05-27. due dates falls under those 6 dates between(2030-05-21 & 2030-05-27) will be shown in the result.

id
1
4

我的问题与Generating a series of dates不同。我期望有一种动态的方法来根据开始日期检查到期日期

感谢Kannan

1 个答案:

答案 0 :(得分:0)

在MySQL中,似乎遵循这些要求的查询就足够了。 (几乎)其他所有内容都可以并且应该在应用程序级代码中处理...

SELECT *
     , CASE my_period WHEN 'day'   THEN start_date + INTERVAL my_interval DAY 
                      WHEN 'week'  THEN start_date + INTERVAL my_interval WEEK 
                      WHEN 'month' THEN start_date + INTERVAL my_interval MONTH
                      WHEN 'year'  THEN start_date + INTERVAL my_interval YEAR
                      END due_date
  FROM my_table;