Oracle DB to_date with year-to_date(2017,' YYYY')意外回报

时间:2017-12-05 08:55:06

标签: oracle oracle11g to-date

在编写一些查询时,我只需返回那些在今年(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')会返回2017/12/01,下个月会返回2017/01/01吗?它为什么这样工作?我希望无论当前月份是否总是返回2017/01/01(如果月份部分确实在改变,取决于sysdate)。

1 个答案:

答案 0 :(得分:2)

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