【问题标题】:How do we select data based on month and year in oracle queryoracle查询中如何根据月份和年份选择数据
【发布时间】:2018-01-23 00:23:06
【问题描述】:

我进行了研究,发现可以在 MSQL 中使用

SELECT * FROM sales WHERE month(sellDate) = 3 AND YEAR(sellDate) = 2017

但是当我尝试使用 Oracle 时,它​​返回给我

ORA-00904: "YEAR": invalid identifier

有什么方法可以在 oracle 查询中调用基于月份和年份的数据吗?

已解决

非常感谢,我也想出了解决办法

我就是这样做的.. :)

select * from sales where to_char(sell,'MM')='09' AND to_char(sell,'YYYY')='2018';

【问题讨论】:

  • 你试过select * from sales where to_char(sell_date, 'MM/YYYY') = '03/2017'; 吗?
  • 如果您有日期索引和大量数据,则应使用 BETWEEN(使用每月 1 日 00:00 和下个月 1 日 00:00)

标签: sql oracle jdbc oracle10g


【解决方案1】:

基本上,在您的结构中输入此代码。 希望这会有所帮助。

 select * from sales where to_char(sell,'MM')='09' AND to_char(sell,'YYYY')='2018';

【讨论】:

    【解决方案2】:

    您可以使用extractto_char,但是由于它们作用于表列值,它们将导致表中的每个值都被转换以进行比较,这是一种浪费,并且会阻止使用该列上的任何索引.

    最好将你的目标年份和月份转换为与列的数据类型相匹配,然后使用范围:

    SELECT * FROM sales
    WHERE sellDate >= date '2017-03-01'
    AND sellDate < date '2017-04-01'
    

    或者如果年份和月份是变量(所以你不能使用日期文字)你可以使用to_date()将年份和月份转换为日期,并使用add_months()查找下个月的开始,例如:

    SELECT * FROM sales
    WHERE sellDate >= to_date('2017' || '03', 'YYYYMM')
    AND sellDate < add_months(to_date('2017' || '03', 'YYYYMM'), 1)
    

    如果您将年份和月份作为数字而不是字符串传递,您可以使用to_char 将它们显式转换为字符串。

    【讨论】:

      【解决方案3】:

      您可以使用EXTRACTdate 获取monthyear。 例如

      SELECT Extract(YEAR
                     FROM CURRENT_DATE),
             EXTRACT(MONTH
                     FROM CURRENT_DATE)
      FROM dual;
      

      它会产生如下结果。

      所以你发布的查询可以重写如下。

      SELECT *
      FROM sales
      WHERE EXTRACT(MONTH
                    FROM sellDate) = 3
        AND Extract(YEAR
                    FROM sellDate) = 2017;
      

      您可以查看演示here

      【讨论】:

        【解决方案4】:

        尝试使用 Extract 请确保 sellDate 是日期列或使用 to_date 将其更改为日期

        SELECT * FROM sales WHERE EXTRACT(MONTH from sellDate) = 3 and EXTRACT(YEAR from sellDate) = 2017;
        

        【讨论】:

          【解决方案5】:

          您可以使用to_char 获取年/月:

          SELECT * FROM dual WHERE to_char(sysdate,'MM') = 8 AND to_char(sysdate,'YYYY') = 2017
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-02-24
            • 2018-03-02
            • 1970-01-01
            • 2017-01-08
            • 1970-01-01
            • 1970-01-01
            • 2021-11-25
            相关资源
            最近更新 更多