【问题标题】:How do I get the current year using SQL on Oracle?如何在 Oracle 上使用 SQL 获取当前年份?
【发布时间】:2010-11-10 07:42:09
【问题描述】:

我需要在 SQL 语句中添加当前年份作为变量,如何使用 SQL 检索当前年份?

之间 TO_DATE('01/01/**currentYear** 00:00:00', 'DD/MM/YYYY HH24:MI:SS') 和 TO_DATE('31/12/**currentYear** 23:59:59', 'DD/MM/YYYY HH24:MI:SS')

【问题讨论】:

    标签: sql oracle date


    【解决方案1】:

    为什么不使用 YEAR 函数?

    SELECT * FROM table WHERE YEAR(date_field)=YEAR(SYSDATE);
    

    【讨论】:

      【解决方案2】:

      使用 to_char:

      select to_char(sysdate, 'YYYY') from dual;
      

      在您的示例中,您可以使用以下内容:

      BETWEEN trunc(sysdate, 'YEAR') 
          AND add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60;
      

      比较值正是您所要求的:

      select trunc(sysdate, 'YEAR') begin_year
           , add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60 last_second_year
      from dual;
      
      BEGIN_YEAR  LAST_SECOND_YEAR
      ----------- ----------------
      01/01/2009  31/12/2009
      

      【讨论】:

      • 从下一年开始跟踪一秒以获得今年的最后一秒,这将适用于日期和假定的时间戳,没有小数秒。如果您最终得到时间戳和小数秒,那么某些值可能在当前年份内,并且被 between <begin this year> and <end next year> - 1 second 遗漏。在不同的 RDBMS 中工作,每个 RDBMS 都有多种日期/时间类型,我推荐并更喜欢 start_of_this_year <= value_under_test and value_under_test < 'start_of_next_year
      • @ShannonSeverance 这很容易被误读。需要明确的是,FerranB 的查询有效——不存在小数秒搞砸的风险。您所描述的是另一种通用解决方案,它适用于时间戳和日期。 (我并不是说您另有主张……只是为了向可能会产生错误想法的读者强调这一点。)您的评论作为单独的答案可能会更好,因为您提到的风险不适用于 FerranB 的查询。
      【解决方案3】:

      既然我们这样做到死 - 您不必指定年份:

      select * from demo
      where  somedate between to_date('01/01 00:00:00', 'DD/MM HH24:MI:SS')
                      and     to_date('31/12 23:59:59', 'DD/MM HH24:MI:SS');
      

      但是,如果您想指定属于当前年份的所有日期值,FerranB 接受的答案更有意义。

      【讨论】:

        【解决方案4】:

        另一种选择是:

        SELECT * FROM mytable
         WHERE TRUNC(mydate, 'YEAR') = TRUNC(SYSDATE, 'YEAR');
        

        【讨论】:

          【解决方案5】:

          在 oracle-sql 中显示当前系统日期

             select sysdate from dual;
          

          【讨论】:

          • 显示当前日期不是问题。
          【解决方案6】:

          使用extract(datetime) 函数非常简单。

          返回年、月、日、分、秒

          例子:

          select extract(year from sysdate) from dual;
          

          【讨论】:

          • extract 函数只会从datetime 类型字段(如sysdate)中提取年、月和日。不过,它会从timestamp 字段中提取其他字段。
          【解决方案7】:

          另一种选择是:

          SELECT *
            FROM TABLE
           WHERE EXTRACT( YEAR FROM date_field) = EXTRACT(YEAR FROM sysdate) 
          

          【讨论】:

          • 这与基于函数的索引相结合将使查询速度非常快。
          • 基于函数的索引会在这里增加不必要的复杂性。既然可以使用简单的索引,为什么还要使用 FBI?
          • 如果函数(如 EXTRACT)应用于列(在 Oracle 11g 上测试),则不会使用 date_field 上的简单索引 - 如果这样做会很好。但是,可以在 EXTRACT(YEAR FROM date_field) 上使用基于函数的索引。
          • 在这种情况下使用 FBI 的另一个优点是直方图可以为优化器提供更准确的关于表中年份分布的统计信息。
          猜你喜欢
          • 2014-07-20
          • 2018-06-03
          • 1970-01-01
          • 2018-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-22
          相关资源
          最近更新 更多