我们如何select数据在oracle查询中根据月份和年份

How do we select data based on month and year in oracle query

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

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

但是当我尝试使用 Oracle 时,它​​ returns 我

ORA-00904: "YEAR": invalid identifier

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

已解决

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

我就是这样做的..:)

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

您可以使用 to_char 得到 year/month:

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

尝试使用 Extract 请确保 sellDate 是日期列或使用 to_date

将其更改为日期
SELECT * FROM sales WHERE EXTRACT(MONTH from sellDate) = 3 and EXTRACT(YEAR from sellDate) = 2017;

您可以使用 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

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

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

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.

将它们显式转换为字符串

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

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