这是部分跟进其他答案,但解释(希望)正在发生的事情。
当你这样做时,假设myDateColumn
是DATE
:
to_char(to_date(myDateColumn,'dd/mm/yyyy'), 'DAY')
你有一个隐式转换;它真的是这样做的:
to_char(to_date(to_char(myDateColumn),'dd/mm/yyyy'), 'DAY')
这是:
to_char(to_date(to_char(myDateColumn, <NLS_DATE_FORMAT>),'dd/mm/yyyy'), 'DAY')
既然你 get SATURDAY
,看起来你的NLS_DATE_FORMAT
is 'DD/MM/YY'
,或者至少这是我迄今为止发现的唯一复制方法:
alter session set nls_date_format = 'DD/MM/YYYY';
select date '2013-04-01' date1,
to_char(date '2013-04-01', 'Day') day1,
to_date(to_char(date '2013-04-01', 'dd/mm/yy'), 'dd/mm/yyyy') date2,
to_char(to_date(to_char(date '2013-04-01', 'dd/mm/yy'), 'dd/mm/yyyy'),
'Day') day2
from dual;
DATE1 DAY1 DATE2 DAY2
---------- --------- ---------- ---------
01/04/2013 Monday 01/04/0013 Saturday
因此,即使您myDateColumn
真的持有2013-04-01
,您的隐式转换也意味着它被视为0013-04-01
,(显然)是星期六。
您可以指定格式并to_char()
在to_date()
.to_date()
select to_char(myDateColumn, 'DAY'), ...
值得指出的是,生成的文本DAY
也取决于您的 NLS 设置;例如,请参阅此处和此处的文档。如果你想确保它总是MONDAY
,用英语,你可以强制它作为转换的一部分,但我认为这看起来不会是一个考虑因素:
select to_char(myDateColumn, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'), ...