计算不同期间的“下一个日期”

时间:2019-05-27 15:42:02

标签: mysql sql

我有一张名为checks的桌子。这有几个时期。 为此,要有term-例如每年每5年每6个月。它们都写为{number} {年/月/周}。

我需要一个查询,该查询为我提供与过去(或将来)给定起点之间最接近的支票。

以下内容为我提供了next_date,但它只能工作一次。如果您的开始日期是2016年1月1日,并且您有6个月的支票和年度支票,那么您总是可以从最底层的解决方案中获得年度支票,因为2017/01/01与现在最接近。

select `checks`.*,
IF(SUBSTRING_INDEX(term, ' ', -1) = 'weeks', DATE_ADD('2016-01-01', INTERVAL SUBSTRING_INDEX(term, ' ', 1) week),
IF(SUBSTRING_INDEX(term, ' ', -1) = 'months', DATE_ADD('2016-01-01', INTERVAL SUBSTRING_INDEX(term, ' ', 1) month), 
IF(SUBSTRING_INDEX(term, ' ', -1) = 'years', DATE_ADD('2016-01-01', INTERVAL SUBSTRING_INDEX(term, ' ', 1) year), 0)))
as next_date from `checks`

实际上,在撰写本文时,应该给我6个月的支票-因为那应该发生在2019年6月1日,这是最接近我当前日期(2019/05/27)的时间。

有没有一种方法可以在查询中确定这一点?

1 个答案:

答案 0 :(得分:0)

这似乎是一种非常糟糕的格式,但我认为您可以做到:

select c.*,
       (case when term like '% weeks'
             then date('2016-01-01') + interval (substring_index(term, -2) + 0) weeks
             when term like '% months'
             then date('2016-01-01') + interval (substring_index(term, -2) + 0) month
             when term like '% years'
             then date('2016-01-01') + interval (substring_index(term, -2) + 0) year
      end) as next_date 
from checks c
order by next_date asc
limit 1;