带有年份的 Oracle DB to_date - to_date(2017 ,'YYYY') 意外返回

标签 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 发生变化)。

最佳答案

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

相关文章:

java - 如何在java adf中显示数据库返回错误消息

oracle - 获取Oracle PL/SQL中调用过程或函数的名称

oracle - 使用 Oracle DB 配置 Tomcat 的 JDBCRealm - 什么是正确的表结构?

oracle - Oracle 中的 BITMAP MERGE 和 BITMAP OR 有什么区别?

linux - 面对 ORA-01033 : ORACLE initialization or shutdown in progress due to data file issue

php - 带有 codeigniter 的 Oracle to_date 函数

sql - Oracle 中的 ansi SQL 日期函数

node.js - 无法使用npm安装oracle包

python - Pandas to_sql 返回 cx_Oracle.DatabaseError : ORA-00942: table or view does not exist

oracle - to_char 函数返回,Oracle Database 10g Express 10.2.0.1.0 中的零