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'
虽然我只需要写一些查询 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'