Mysql 计算';下一个日期';不同时期

Mysql 计算';下一个日期';不同时期,mysql,sql,Mysql,Sql,我有一个名为checks的表。这会持续几个时期。 为此,支票有一个期限——如每年、每5年或每6个月一次。它们都写为{number}{years/months/weeks} 我需要一个查询,该查询将为我提供未来距离过去(或未来)给定起点最近的检查 下面给出了下一个日期,但它只工作一次。如果您的开始日期是2016/01/01,并且您有6个月的检查和一年的检查,那么您总是会得到底部解决方案的一年检查,因为2017/01/01最接近现在 select `checks`.*, IF(SUBSTRING_I

我有一个名为
checks
的表。这会持续几个时期。 为此,支票有一个
期限
——如每年、每5年或每6个月一次。它们都写为{number}{years/months/weeks}

我需要一个查询,该查询将为我提供未来距离过去(或未来)给定起点最近的检查

下面给出了下一个日期,但它只工作一次。如果您的开始日期是2016/01/01,并且您有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年1月6日,也就是最接近我现在的日期(2019年5月27日)


有没有办法在查询中确定这一点?

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

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;

谢谢,我同意格式需要改进。然而,这仍然只能将2016/06/01和2017/01/01作为下一个日期,而不是(预计)2019/06/01和2020/01/01。@JoshuaW。您的问题是询问一行(“我需要一个查询,该查询将为我提供未来距离过去(或未来)给定起点最近的支票)。”。我不知道多个值从何而来。第一个值确实是我需要的值,但它必须是6个月期限。我看错了你的答案,忽略了限制部分。您的查询在任何情况下都会返回6个月期限。确切地说,如果我在12月运行这个查询,它应该会再次返回1年检查(这看起来确实是一个糟糕的格式)