Case When:使用 > 日期和 < 具有多个条件的日期

Case When: Using > Dates and < Dates With Multiple Conditions

我有一个包含三层的 CASE WHEN 语句,每一层定义一个特定的限制标准,满足 A、B 或 C 的特定类别。A 和 B 严重依赖于 > 或 < 日期。

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 类,我应该只检索 2019 年 1 月 10 日 (dd-mm-yyyy) 之后的日期,但我得到的日期可以追溯到 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 函数。

有什么解决这个日期问题的建议吗?

您需要简单地检查日期,而不是将它们转换为字符串,因为日期顺序不同于应用于表示日期的字符串的字典顺序。

您的代码可以是:

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' 部分是在 Oracle 中表达日期的 ANSI 方式。

在select列表中,您可以使用to_char您需要的方式来获得格式化输出。