Случай, когда: использование> дат и <дат с несколькими условиями - PullRequest
0 голосов
/ 29 октября 2019

У меня есть оператор CASE WHEN с тремя слоями, каждый из которых определяет определенный критерий ограничения, который соответствует определенной категории для A, B или C. A и B сильно зависят от> или <даты. </p>

The criteria are as follows:

When Date is less than 01-OCT-2019 AND Limit is greater than 10,000 Then 'A'

When Date is greater than 01-OCT-2019 AND Limit is less than 90,000 And Plan = CP Then 'B'

When Date is greater than 01-OCT-2019 AND Limit is less than 60,000 And Plan = CO Then 'B'

ELSE 'C'

Это записано как

 CASE 
    WHEN
          TO_CHAR(DATE,'dd-mm-yyyy') < '01-10-2019'
          AND Limit > 10000
          THEN 'A'         
    WHEN 
          TO_CHAR(DATE,'dd-mm-yyyy') > '01-10-2019'
          AND Limit < 90000
          AND Plan = 'CP'
          THEN 'B' 
    WHEN 
          TO_CHAR(DATE,'dd-mm-yyyy') > '01-10-2019'
          AND Limit < 60000
          AND Plan = 'CO'
          THEN 'B'
          ELSE 'C' 
    END AS Category

Несмотря на то, что запрос выполняется, классифицированные результаты не являются точными в соответствии с условиями даты. Например:

Для категории B я должен получать даты только после 01-10-2019 (дд-мм-гггг), но я получаю даты, которые растягиваются до 2018 года.

+----+------------+---------+------+----------+---+
| ID |    Date    |  Limit  | Plan | Category |   |  
+----+------------+---------+------+----------+---+
|  1 | 20-11-2018 |  67000  |  CP  |    B     | X |  
|  2 | 08-08-2019 |  32000  |  CO  |    C     | ✓ |  
|  3 | 05-03-2019 |  12000  |  CO  |    A     | ✓ |  
|  4 | 18-10-2019 |  70000  |  CP  |    B     | ✓ |
|  5 | 16-04-2019 |  52000  |  CO  |    B     | X |
|  6 | 23-07-2018 |  17000  |  CP  |    A     | ✓ |     
+----+------------+---------+------+----------+---+

База данных показывает дату, структурированную как «01 -OCT-2019», однако я хочу, чтобы выходные данные отображались как «01 -10-2019». В этом случае я включил функцию To_Char.

Есть предложения по исправлению этой даты?

1 Ответ

3 голосов
/ 29 октября 2019

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

Ваш код может быть:

CASE 
    WHEN
          DATE < date '2019-10-01'
          AND Limit > 10000
          THEN 'A'         
    WHEN 
          DATE > date '2019-10-01'
          AND Limit < 90000
          AND Plan = 'CP'
          THEN 'B' 
    WHEN 
          DATE > date '2019-10-01'
          AND Limit < 60000
          AND Plan = 'CO'
          THEN 'B'
          ELSE 'C' 
    END AS Category

Обратите внимание, что я сохранил ваш столбец DATE, даже если это восстановленное слово;date '2019-10-01' - это ANSI-способ выражения даты в Oracle.

В списке выбора вы можете использовать to_char так, как вам нужно для получения отформатированного вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...