date 'a.transaction_date' 试图将 date literal 与可变列值混合,但随后还将列名放在单引号内,您最终会做:
to_date('a.transaction_date', 'YYYY-MM-DD')
它也会得到 ORA-01841,原因可能更清楚。
如果transaction_date 已经是一个日期,那么只需引用它:
SELECT DISTINCT
a.transaction_date,
to_char(a.transaction_date,'DAY') as Day
FROM transactions_table a
如果它是一个字符串 - 它不应该是! - 然后将该值正确转换为日期:
SELECT DISTINCT
a.transaction_date,
to_char(to_date(a.transaction_date, 'YYYY-MM-DD'),'DAY') as Day
FROM transactions_table a
...或使用任何适当的格式掩码。
还要注意DAY(以及缩写的DY,或Dy,这可能是您真正想要的)输出取决于您的NLS日期语言,但如果您希望它始终如此,您可以覆盖它用英文,例如:
SELECT DISTINCT
a.transaction_date,
to_char(a.transaction_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') as Day
FROM transactions_table a
使用 CTE 的快速演示:
-- CTE for dummy date
with transactions_table(transaction_date) as (
select date '2019-01-01' from dual
union all
select date '2019-09-01' from dual
)
-- actual query
SELECT DISTINCT
a.transaction_date,
to_char(a.transaction_date,'Dy','NLS_DATE_LANGUAGE=ENGLISH') as Day
FROM transactions_table a
/
TRANSACTIO DAY
---------- ------------
2019-01-01 Tue
2019-09-01 Sun