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

时间:2017-08-15 05:06:17

标签: sql oracle jdbc oracle10g

我做了我的研究,发现可以用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';

5 个答案:

答案 0 :(得分: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将其显式转换为字符串。

答案 1 :(得分:1)

您可以使用EXTRACTmonth获取yeardate。 例如

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

它将生成如下结果。

enter image description here

因此,您发布的查询可以重写如下。

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

您可以查看演示here

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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