SQL-запрос в стиле фанк - PullRequest
1 голос
/ 18 июля 2011

Хорошо, вот некоторые примеры данных и ожидаемые результаты, которые я хотел бы:

  • 2011-06-26 17: 07: 38-04 <- Дата начала </li>
  • 2011-10-01 00: 00: 00-04 <- Требуемая дата </li>
  • 91 <- Продолжительность в днях </p>

  • 2011-06-25 20: 08: 46-04 <- Дата начала </p>

  • 2011-09-01 00: 00: 00-04 <- Требуемая дата </li>
  • 62 <- Продолжительность в днях </li>

Вот условия:

  • Если день с 1-го по 25-й, добавьте два месяца плюс сколько дней до следующего первого
  • Если день 26-го числа до конца месяца, прибавьте три месяца плюс сколько дней до следующего первого

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

CASE
    WHEN (((DATE_TRUNC('month', 
        (date_field + INTERVAL '5 DAYS')) + INTERVAL '2 MONTH') - 
        (date_field + INTERVAL '5 DAYS') >= 62) AND 
        ((DATE_TRUNC('month', (date_field + INTERVAL '5 DAYS')) + 
        INTERVAL '2 MONTH') - (date_field + INTERVAL '5 DAYS') <= 92))
    THEN (DATE_TRUNC('month', 
        (date_field + INTERVAL '5 DAYS')) + INTERVAL '2 MONTH')
    ELSE (DATE_TRUNC('month', 
        (date_field + INTERVAL '5 DAYS')) + INTERVAL '3 MONTH')
END

Ответы [ 2 ]

3 голосов
/ 18 июля 2011
select 
    case 
        when extract(day from date_field) <= 25 
        then date_trunc('month', date_field + interval '3 months')
        else date_trunc('month', date_field + interval '4 months')
    end
from t
1 голос
/ 18 июля 2011

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

CASE WHEN EXTRACT(DAY FROM date_field) BETWEEN 1 AND 25
     THEN (date_field - EXTRACT(DAY FROM date_field):: int + 1 + INTERVAL '3 MONTH')
     ELSE (date_field - EXTRACT(DAY FROM date_field):: int + 1  + INTERVAL '4 MONTH') END

Обратите внимание, что у меня нет необходимого типа сервера для проверки этого, но, похоже, это правильно.

...