有没有办法 CASE DD-MMM-YYYY 日期格式?
Is there a way to CASE DD-MMM-YYYY date format?
我正在尝试对日期格式为 DD-MMM-YYYY 的列进行大小写处理。
基本上,我正在尝试将日期转换为财政年度列以更好地分析工作数据。
由于隐私问题,我不能在这里分享实际数据。以下是我的语法。
I get the ORA-00932: inconsistent datatypes: expected DATE got CHAR.
TRAVEL_DT 列是 DATE 数据类型。
Select Lst_name, frst_nm, travel_date,
case when TRAVEL_DT <= '30-SEP-2020' THEN 'FY-2019'
WHEN TRAVEL_DT >= '01-OCT-2020' THEN 'FY-2020'
ELSE TRAVEL_DT
END AS FISCAL_YEAR
FROM TRAVEL_DATA
问题是您的 case
returns 文本在 when
子句中,日期在 else
中。试试这个:
Select Lst_name, frst_nm, travel_date,
case when TRAVEL_DT <= '30-SEP-2020' THEN 'FY-2019'
WHEN TRAVEL_DT >= '01-OCT-2020' THEN 'FY-2020'
ELSE to_char(TRAVEL_DT)
END AS FISCAL_YEAR
FROM TRAVEL_DATA
要获取会计年度开始的日期,您可以:
- 减去9个月;
- 截断到年初;然后
- 再增加 9 个月
如果您只想知道会计年度,那么:
- 减去9个月;
- 提取年份。
像这样:
Select Lst_name,
frst_nm,
travel_dt,
'FY-' || EXTRACT(YEAR FROM ADD_MONTHS(travel_dt, -9)) AS fiscal_year,
ADD_MONTHS(TRUNC(ADD_MONTHS(travel_dt,-9),'YY'),9) AS start_of_fiscal_year
FROM TRAVEL_DATA
其中,对于示例数据:
CREATE TABLE travel_data (lst_name, frst_nm, travel_dt) AS
SELECT 'Abbot', 'Alice', DATE '2020-09-30' FROM DUAL UNION ALL
SELECT 'Baron', 'Betty', DATE '2020-10-01' FROM DUAL UNION ALL
SELECT 'Curry', 'Carol', DATE '2019-10-01' FROM DUAL UNION ALL
SELECT 'Doyle', 'Doris', DATE '2021-09-30' FROM DUAL UNION ALL
SELECT 'Eagle', 'Emily', DATE '2021-10-01' FROM DUAL
输出:
LST_NAME
FRST_NM
TRAVEL_DT
FISCAL_YEAR
START_OF_FISCAL_YEAR
Abbot
Alice
2020-09-30 00:00:00
FY-2019
2019-10-01 00:00:00
Baron
Betty
2020-10-01 00:00:00
FY-2020
2020-10-01 00:00:00
Curry
Carol
2019-10-01 00:00:00
FY-2019
2019-10-01 00:00:00
Doyle
Doris
2021-09-30 00:00:00
FY-2020
2020-10-01 00:00:00
Eagle
Emily
2021-10-01 00:00:00
FY-2021
2021-10-01 00:00:00
如果你只是想修复你的代码,那么你可以使用日期文字:
Select Lst_name,
frst_nm,
travel_dt,
CASE
WHEN TRAVEL_DT < DATE '2020-10-01' THEN 'FY-2019'
WHEN TRAVEL_DT >= DATE '2020-10-01' THEN 'FY-2020'
END AS FISCAL_YEAR
FROM TRAVEL_DATA
注意:您不需要 ELSE
条件,因为它只会在 TRAVEL_DT
为 NULL
时匹配。
db<>fiddle here
我正在尝试对日期格式为 DD-MMM-YYYY 的列进行大小写处理。
基本上,我正在尝试将日期转换为财政年度列以更好地分析工作数据。 由于隐私问题,我不能在这里分享实际数据。以下是我的语法。
I get the ORA-00932: inconsistent datatypes: expected DATE got CHAR.
TRAVEL_DT 列是 DATE 数据类型。
Select Lst_name, frst_nm, travel_date,
case when TRAVEL_DT <= '30-SEP-2020' THEN 'FY-2019'
WHEN TRAVEL_DT >= '01-OCT-2020' THEN 'FY-2020'
ELSE TRAVEL_DT
END AS FISCAL_YEAR
FROM TRAVEL_DATA
问题是您的 case
returns 文本在 when
子句中,日期在 else
中。试试这个:
Select Lst_name, frst_nm, travel_date,
case when TRAVEL_DT <= '30-SEP-2020' THEN 'FY-2019'
WHEN TRAVEL_DT >= '01-OCT-2020' THEN 'FY-2020'
ELSE to_char(TRAVEL_DT)
END AS FISCAL_YEAR
FROM TRAVEL_DATA
要获取会计年度开始的日期,您可以:
- 减去9个月;
- 截断到年初;然后
- 再增加 9 个月
如果您只想知道会计年度,那么:
- 减去9个月;
- 提取年份。
像这样:
Select Lst_name,
frst_nm,
travel_dt,
'FY-' || EXTRACT(YEAR FROM ADD_MONTHS(travel_dt, -9)) AS fiscal_year,
ADD_MONTHS(TRUNC(ADD_MONTHS(travel_dt,-9),'YY'),9) AS start_of_fiscal_year
FROM TRAVEL_DATA
其中,对于示例数据:
CREATE TABLE travel_data (lst_name, frst_nm, travel_dt) AS
SELECT 'Abbot', 'Alice', DATE '2020-09-30' FROM DUAL UNION ALL
SELECT 'Baron', 'Betty', DATE '2020-10-01' FROM DUAL UNION ALL
SELECT 'Curry', 'Carol', DATE '2019-10-01' FROM DUAL UNION ALL
SELECT 'Doyle', 'Doris', DATE '2021-09-30' FROM DUAL UNION ALL
SELECT 'Eagle', 'Emily', DATE '2021-10-01' FROM DUAL
输出:
LST_NAME FRST_NM TRAVEL_DT FISCAL_YEAR START_OF_FISCAL_YEAR Abbot Alice 2020-09-30 00:00:00 FY-2019 2019-10-01 00:00:00 Baron Betty 2020-10-01 00:00:00 FY-2020 2020-10-01 00:00:00 Curry Carol 2019-10-01 00:00:00 FY-2019 2019-10-01 00:00:00 Doyle Doris 2021-09-30 00:00:00 FY-2020 2020-10-01 00:00:00 Eagle Emily 2021-10-01 00:00:00 FY-2021 2021-10-01 00:00:00
如果你只是想修复你的代码,那么你可以使用日期文字:
Select Lst_name,
frst_nm,
travel_dt,
CASE
WHEN TRAVEL_DT < DATE '2020-10-01' THEN 'FY-2019'
WHEN TRAVEL_DT >= DATE '2020-10-01' THEN 'FY-2020'
END AS FISCAL_YEAR
FROM TRAVEL_DATA
注意:您不需要 ELSE
条件,因为它只会在 TRAVEL_DT
为 NULL
时匹配。
db<>fiddle here