在编写一些查询时,我只需返回那些在今年(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)。
答案 0 :(得分:2)
在Oracle中,TO_DATE
will assume:
您只指定年份(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'