我有一张名为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)的时间。
有没有一种方法可以在查询中确定这一点?
答案 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;