03U*_*Usr 0 sql oracle oracle10g
我使用它来获取给定日期的名称,所以以下给我星期一:
Select to_char(to_date('01/04/2013','dd/mm/yyyy'), 'DAY') from dual
Run Code Online (Sandbox Code Playgroud)
但是,如果我将相同的东西应用到一个表并用他们的名字提取日期我得到一个错误的日期名称,在'01/April/2013'的情况下,它给了我星期六.
Select to_char(to_date(myDateColumn,'dd/mm/yyyy'), 'DAY'), myDateColumn
From myTable WHERE myDateColumn = to_date('01/04/2013','dd/mm/yyyy')
Run Code Online (Sandbox Code Playgroud)
这就是我在MS SQL上的表现,但我需要为Oracle 10g数据库做这个,这是正确的方法吗?
谢谢
这部分跟进了其他答案,但解释(希望)正在发生的事情.
当你这样做时,假设myDateColumn
是DATE
:
to_char(to_date(myDateColumn,'dd/mm/yyyy'), 'DAY')
Run Code Online (Sandbox Code Playgroud)
你有一个隐含的转换; 它真的这样做:
to_char(to_date(to_char(myDateColumn),'dd/mm/yyyy'), 'DAY')
Run Code Online (Sandbox Code Playgroud)
这是:
to_char(to_date(to_char(myDateColumn, <NLS_DATE_FORMAT>),'dd/mm/yyyy'), 'DAY')
Run Code Online (Sandbox Code Playgroud)
既然你得到了SATURDAY
,看起来可能NLS_DATE_FORMAT
是你的'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
Run Code Online (Sandbox Code Playgroud)
因此,即使你myDateColumn
真的持有2013-04-01
,你的implcit转换意味着它被视为0013-04-01
,(显然)是星期六.
你可以指定格式并使其显式to_char()
内部to_date()
,但希望很明显这是毫无意义的,并且它更简单,因为vc74建议并且只是删除额外的 - 错误 - to_date()
调用:
select to_char(myDateColumn, 'DAY'), ...
Run Code Online (Sandbox Code Playgroud)
可能值得指出的是,所产生的文本DAY
也取决于您的NLS设置; 例如,请参阅此处和此处的文档.如果你想确保它总是MONDAY
用英语,你可以强迫它作为转换的一部分,虽然我不认为它在这里看起来像是一个考虑因素:
select to_char(myDateColumn, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'), ...
Run Code Online (Sandbox Code Playgroud)