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
您需要的方式来获得格式化输出。
我有一个包含三层的 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
您需要的方式来获得格式化输出。