Рассчитать «следующую дату» с разными периодами - PullRequest
0 голосов
/ 27 мая 2019

У меня есть одна таблица с именем checks.Это держит несколько периодов.Для этого чеки имеют term - как каждый год , каждые 5 лет или каждые 6 месяцев .Все они написаны как {число} {годы / месяцы / недели}.

Мне нужен запрос, который дает мне проверку, ближайшую в будущем от заданной начальной точки в прошлом (или будущем).

Следующее дает мне next_date, но это работает только один раз.Если ваша начальная дата была 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 месяцев - потому что это должно произойти 01.06.2009, что ближе всего к моей текущей дате (2019/05/27).

Есть ли способ определить это в запросе?

1 Ответ

0 голосов
/ 27 мая 2019

Это кажется очень плохим форматом, но я думаю, что вы можете сделать:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...