虽然写了几个查询,但我只需要返回那些在今年(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 发生变化)。
最佳答案
在 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'
关于带有年份的 Oracle DB to_date - to_date(2017 ,'YYYY') 意外返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47649541/