(Oracle SQL)如何显示两年内下订单的客户的信息?

(Oracle SQL)如何显示两年内下订单的客户的信息?,sql,oracle,select,sql-order-by,Sql,Oracle,Select,Sql Order By,我有一个名为Orders的表,其中有关于客户及其订单的信息,我只想检索2009年和2010年的客户订单信息。我怎样才能得到它?我已经编写了下面的语句,但没有检索到任何信息 SELECT customer_id FROM cs_ordenes WHERE order_date BETWEEN '01/01/2009' AND '31/12/2009' AND order_date BETWEEN '01/01/2010' AND '31/12/2010' ORDER B

我有一个名为Orders的表,其中有关于客户及其订单的信息,我只想检索2009年和2010年的客户订单信息。我怎样才能得到它?我已经编写了下面的语句,但没有检索到任何信息

SELECT   customer_id
FROM     cs_ordenes
WHERE    order_date BETWEEN '01/01/2009' AND '31/12/2009'
AND      order_date BETWEEN '01/01/2010' AND '31/12/2010'
ORDER BY customer_id DESC;

简化
WHERE
子句怎么样

SELECT customer_id
FROM cs_ordenes
WHERE order_date >= DATE '2009-01-01' AND
      order_date < DATE '2011-01-01'
ORDER BY customer_id DESC;
选择客户id
来自cs_ordenes
其中订单日期>=日期“2009-01-01”和
订单日期<日期'2011-01-01'
按客户id描述订购;
如果将两条语句之间的
更改为
,则原始逻辑将正常工作。一个日期不可能是2009年和2011年,因此您的查询不会返回任何行。不过,上述逻辑更简单


而且,在日期之间使用
是危险的,因为有时日期有时间成分。这就是我喜欢简单不等式的原因。

简化
WHERE
子句怎么样

SELECT customer_id
FROM cs_ordenes
WHERE order_date >= DATE '2009-01-01' AND
      order_date < DATE '2011-01-01'
ORDER BY customer_id DESC;
选择客户id
来自cs_ordenes
其中订单日期>=日期“2009-01-01”和
订单日期<日期'2011-01-01'
按客户id描述订购;
如果将两条语句之间的
更改为
,则原始逻辑将正常工作。一个日期不可能是2009年和2011年,因此您的查询不会返回任何行。不过,上述逻辑更简单


而且,在日期之间使用
是危险的,因为有时日期有时间成分。这就是我喜欢简单不等式的原因。

您可以使用聚合来检查每年是否至少有一个订单

select customer_id
from cs_ordenes
where order_date >= date '2009-01-01'
    and order_date < date '2011-01-01'
group by customer_id
having count(distinct to_char(order_date, 'YYYY')) = 2
选择客户id
来自cs_ordenes
其中订单日期>=日期“2009-01-01”
订单日期<日期'2011-01-01'
按客户id分组
计数(不同于字符(订单日期,'YYYY'))=2

count(不同于字符(订单日期,'YYYY'))
为每个客户查找与订单日期不同的年份。在本例中,由于我们已经使用WHERE子句过滤了日期范围为两年的数据,如果计数为2,则表示每年至少有一个订单。

您可以使用聚合来检查每年是否至少有一个订单

select customer_id
from cs_ordenes
where order_date >= date '2009-01-01'
    and order_date < date '2011-01-01'
group by customer_id
having count(distinct to_char(order_date, 'YYYY')) = 2
选择客户id
来自cs_ordenes
其中订单日期>=日期“2009-01-01”
订单日期<日期'2011-01-01'
按客户id分组
计数(不同于字符(订单日期,'YYYY'))=2

count(不同于字符(订单日期,'YYYY'))
为每个客户查找与订单日期不同的年份。在我们的例子中,由于我们已经使用WHERE子句过滤了日期范围为两年的数据,因此如果计数为2,则表示每年至少有一个订单。

相同的
order\u date
可以在2009年和2010年,因此不会返回任何行。一种方法是计算每个客户订单的不同年数:

select customer_id
from cs_ordenes
where order_date >= date '2009-01-01'
    and order_date < date '2011-01-01'
group by customer_id
having count(distinct to_char(order_date, 'YYYY')) = 2
SELECT   customer_id
FROM     cs_ordenes
WHERE    EXTRACT(YEAR FROM order_date) IN (2009, 2010)
GROUP BY customer_id
HAVING   COUNT(DISTINCT(EXTRACT(YEAR FROM order_date)) = 2
ORDER BY customer_id DESC;

相同的
order\u date
可以在2009年和2010年,因此不会返回任何行。一种方法是计算每个客户订单的不同年数:

SELECT   customer_id
FROM     cs_ordenes
WHERE    EXTRACT(YEAR FROM order_date) IN (2009, 2010)
GROUP BY customer_id
HAVING   COUNT(DISTINCT(EXTRACT(YEAR FROM order_date)) = 2
ORDER BY customer_id DESC;
" 从订单中选择客户id 订单日期介于 截止日期('01-01-2009','dd-mm-yyyy')和截止日期('01-01-2010','dd-mm-yyyy')

“ 从订单中选择客户id 订单日期介于
截止日期('01-01-2009','dd-mm-yyyy')和截止日期('01-01-2010','dd-mm-yyyy')

是的,此语句检索信息,但我只想显示2009年和2010年下订单的客户的信息!感谢您考虑使用带日期的中间值!是的,此语句检索信息,但我只想显示2009年和2010年下订单的客户的信息!感谢您考虑使用带日期的中间值!谢谢古尔夫先生。我不知道这件事!!!我将在Oracle SQL中搜索有关聚合的更多信息。谢谢你的帮助。你的答案是正确的!!!谢谢古尔夫先生。我不知道这件事!!!我将在Oracle SQL中搜索有关聚合的更多信息。谢谢你的帮助。你的答案是正确的!!!