Oracle获取日期名称返回错误的名称

时间:2013-05-29 15:58:23

标签: sql oracle oracle10g

我用这个来获取给定日期的名称,所以以下给我星期一:

Select to_char(to_date('01/04/2013','dd/mm/yyyy'), 'DAY') from dual

但是,如果我将相同的东西应用到一个表并用他们的名字提取日期我得到一个错误的日期名称,在'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')

这就是我在MS SQL上的表现,但我需要为Oracle 10g数据库做这个,这是正确的方法吗?

由于

3 个答案:

答案 0 :(得分:6)

这部分跟进了其他答案,但解释(希望)正在发生的事情。

执行此操作时,假设myDateColumnDATE

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')

由于您获得了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

即使你的myDateColumn确实持有2013-04-01,你的implcit转换意味着它被视为0013-04-01,这显然是星期六。

您可以在to_char()内指定格式并使其成为明确的to_date(),但希望很明显这是毫无意义的,并且它比vc74建议更简单,只是删掉额外的 - 错误的 - to_date()致电:

select to_char(myDateColumn, 'DAY'), ...

值得注意的是,DAY生成的文本也取决于您的NLS设置;例如,请参阅文档herehere。如果你想确保它始终是MONDAY,用英语,你可以强迫它作为转换的一部分,虽然我不认为这似乎是一个考虑因素:

select to_char(myDateColumn, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH'), ...

答案 1 :(得分:4)

由于您的日期列是日期:

Select to_char(myDateColumn, 'DAY'), myDateColumn 
From myTable 
WHERE myDateColumn = to_date('01/04/2013','dd/mm/yyyy')

应该足够了

(这应该是一个评论,而不是一个答案,但它不可读)

答案 2 :(得分:1)

您似乎对myDateColumn的数据类型感到困惑。

你暗示这是一个日期:

WHERE myDateColumn = to_date('01/04/2013','dd/mm/yyyy')

...而且它是一个字符串:

to_char(to_date(myDateColumn,'dd/mm/yyyy'), 'DAY')

查看它的真实含义,不要将日期转换为日期或将字符串与日期进行比较。