Динамический искатель сроков в одном запросе - PullRequest
0 голосов
/ 24 сентября 2018
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 будет иметь срок выполнения через 2 месяца после start_date, id-2 будет иметь срок выполнения через 3 недели и наоборот).период - это число (день, неделя, месяц, год).Требование заключается в том, что Клиент может указать любой период дат.скажем, с 25-06-2026 по 13-07-2026 вот так ... Я должен вернуть идентификаторы, сроки выполнения которых подпадают под этот период. Надеюсь, я ясно дал понять свой вопрос.

Я использую mysql 5.7,Я нашел способ добиться этого с помощью рекурсивных CTE (недоступно в MySQL 5.7).и есть способ достичь этого, заполняя виртуальные записи, используя встроенные подзапросы вместе с объединениями, но это снижает производительность, и мы не можем заполнять виртуальные записи каждый раз, когда приходит запрос клиента (как указано в ссылке Генерация серии дат ) Я достиг точки, чтобы получить результаты для одной даты, что очень просто.Ниже мой запрос.

  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

Мой вопрос отличается от Использование DATE_ADD с именем столбца в качестве значения интервала .Я ожидаю, что динамический способ проверки сроков на основе start_date

Спасибо, Kannan

1 Ответ

0 голосов
/ 24 сентября 2018

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