我做了我的研究,发现可以用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';
答案 0 :(得分:2)
您可以使用extract
或to_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)
您可以使用EXTRACT
从month
获取year
和date
。
例如
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
答案 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';