Oracle DB to_date 年份 - to_date(2017,'YYYY') 意外 return

Oracle DB to_date with year - to_date(2017,'YYYY') unexpected return

虽然我只需要写一些查询 return 那些在今年 (2017) 设置了日期列的行,但这不是我的问题我知道如何用几种不同的方式编写这个查询,但是我遇到了一些奇怪和出乎我意料的事情。谁能解释为什么 Oracle db 11.2 会这样?

select sysdate from dual

returns: 
2017/12/05 09:22:27

select to_date(2017,'YYYY'),trunc(sysdate,'YYYY') from dual
returns :
2017/12/01 00:00:00 2017/01/01 00:00:00

select to_date(2017,'YYYY'),trunc(sysdate,'YYYY') from dual
where trunc(sysdate,'YYYY') = to_date(2017,'YYYY')

no rows returned

为什么to_date(2017,'YYYY')returns2017/12/01,下个月会return2017/01/01吗?为什么会这样?我希望它总是 return 2017/01/01 无论当前月份如何(如果月份部分确实根据 sysdate 而变化)。

在 Oracle 中,TO_DATE will assume 即:

  • 如果不指定年份则为当前年份;
  • 如果不指定月份,则为当前月份;
  • 如果您不指定日期,则为该月的第一天;
  • 如果您不指定时间,则为午夜 (0);
  • 如果您不指定分钟,则为整点后 0 分钟;和
  • 如果您不指定秒数,则分钟为 0 秒。

您只指定了年份 (2017),因此它将是:

  • 您指定年份(2017 年)当前月份的第一天午夜后零分秒。

如果您想要一年的第一天,请指定月份(最好是日期的其余部分):

select to_date( '201701','YYYYMM'),
       trunc(sysdate,'YYYY')
from   dual
where  trunc(sysdate,'YYYY') = to_date( '201701','YYYYMM' )

或者使用日期文字:

select DATE '2017-01-01',
       trunc(sysdate,'YYYY')
from   dual
where  trunc(sysdate,'YYYY') = DATE '2017-01-01'