0

我用它来获取给定日期的名称,所以下面给了我星期一:

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 数据库这样做,这是正确的方法吗?

谢谢

4

3 回答 3

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

既然你 get SATURDAY,看起来你的NLS_DATE_FORMATis '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'), ...
于 2013-05-29T17:09:03.200 回答
4

由于您的日期列是日期:

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

应该足够了

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

于 2013-05-29T16:03:33.900 回答
1

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

您暗示这是一个日期:

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

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

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

看看它到底是什么,不要将日期转换为日期或将字符串与日期进行比较。

于 2013-05-29T16:03:32.217 回答