我们如何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;
您可以使用 EXTRACT
从 date
得到 month
和 year
。
例如
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
您可以使用 extract
或 to_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';
我做了研究,发现可以在 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;
您可以使用 EXTRACT
从 date
得到 month
和 year
。
例如
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
您可以使用 extract
或 to_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';