Динамическая проверка сроков с заданным периодом дат - PullRequest
0 голосов
/ 24 августа 2018
id  start_date  interval  period
1   1/22/2018   2         month 
2   2/25/2018   3         week  
3   11/24/2017  3         day   
4   7/22/2017   1         year  
5   2/25/2018   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 id 
   from (select a.*,
           case 
           when period='week' 
           then mod((to_date('22-07-2018','dd-mm-yyyy')-start_date),7*interval)  
           when period='month' and to_char(to_date('22-07-2018','dd-mm-yyyy'),'dd')=to_char(start_date,'dd') 
                and mod(months_between(to_date('22-07-2018','dd-mm-yyyy'),start_date),interval)=0 
            then 0
            when period='year' and to_char(to_date('22-07-2018','dd-mm-yyyy'),'dd-mm')=to_char(start_date,'dd-mm') 
             and mod(months_between(to_date('22-07-2018','dd-mm-yyyy'),start_date)/12,interval)=0 
            then 0 
            when period='day' 
             and mod((to_date('22-07-2018','dd-mm-yyyy')-start_date),interval)=0 
            then 0 else 1 end filter from kml_subs a) 
            where filter=0;

Но мне нужно сделать это для периода дат, а не для одной даты.Любые предложения или решения будут высоко оценены.

Спасибо, Каннан

1 Ответ

0 голосов
/ 24 августа 2018

Предполагается, что это вопрос Oracle, а не MySQL:

Я думаю, первое, что вам нужно сделать, это рассчитать, когда наступит срок оплаты. Я думаю, что простое заявление случая может справиться с этим для вас:

case when period = 'day' then start_date + numtodsinterval(interval,period)
     when period = 'week' then start_date + numtodsinterval(interval*7,'day')
     when period = 'month' then add_months(start_date,interval)
     when period = 'year' then add_months(start_date,interval*12)
end due_date

Затем, используя это новое поле due_date, вы можете проверить, попадает ли срок оплаты between желаемый диапазон дат.

select *
from(
select id,
       start_date,
       interval,
       period,
       case when period = 'day' then start_date + numtodsinterval(interval,period)
            when period = 'week' then start_date + numtodsinterval(interval*7,'day')
            when period = 'month' then add_months(start_date,interval)
            when period = 'year' then add_months(start_date,interval*12)
            else null end due_date
from data)
where due_date between date '2018-02-25' and date '2018-03-12'

При проверке вышеупомянутого запроса в период с 2/25/18 по 3/12/18 с использованием ваших данных получается следующий вывод:

+----+-------------+----------+--------+-------------+
| id | start_date  | interval | period |  due_date   |
+----+-------------+----------+--------+-------------+
|  2 | 05-FEB-2018 |        3 | week   | 26-FEB-2018 |
|  5 | 25-FEB-2018 |        2 | week   | 11-MAR-2018 |
+----+-------------+----------+--------+-------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...