在oracle SQL中选择并分组多个日期范围

时间:2017-11-23 11:22:04

标签: sql oracle

我想选择相同的日期范围并按年份分组。在这种情况下,我想要从9月到10月每年的客户账单总额。

我的代码现在:

"$data": "/groups/$keys"

这个查询工作正常,但是当我想再添加一年时,结果就是无限循环:

SELECT c.name, c.telefonnumber, TO_CHAR(b.billdate, 'YYYY'), sum(b.sume)
FROM customer c, bill b
WHERE b.customerId = c.id
AND b.datum BETWEEN '01.10.2016' AND '30.09.2016'
GROUP BY c.name, c.telefonnumber, TO_CHAR(b.billdate, 'YYYY');

我也尝试过以String方式进行。在这种情况下,当我只查找9月的结果时,它可以完美地运行,但是只要我添加 OR ,它就会再次成为无限循环:

AND b.datum BETWEEN '01.10.2016' AND '30.09.2016'
OR b.datum BETWEEN '01.10.2015' AND '30.09.2015'

我知道我在某种程度上错过了OR运算符中的某些内容,但由于这只发生在我的日期,所以我有点困惑。

2 个答案:

答案 0 :(得分:1)

此查询正常工作并返回0行,我猜 - 确切地说是01.10.2016和30.09.2016之间的日期数:)

如果您想检查多个范围,请将它们括在大括号中:

... and
  ( 
    b.datum between date '2016-10-01' and date '2017-09-30' or
    b.datum between date '2015-10-01' and date '2016-09-30' or
    ... 
  ) and
...

答案 1 :(得分:0)

看起来WHERE子句中的日期条件的措辞不正确。试试这个:

SELECT c.name, c.telefonnumber, TO_CHAR(b.billdate, 'YYYY'), sum(b.sume)
FROM customer c, bill b
WHERE b.customerId = c.id AND
      (b.datum BETWEEN TO_DATE('01.10.2016', 'DD.MM.YYYY') AND
                      TO_DATE('30.09.2016', 'DD.MM.YYYY') OR
       b.datum BETWEEN TO_DATE('01.10.2015', 'DD.MM.YYYY') AND
                      TO_DATE('30.09.2015', 'DD.MM.YYYY'));

我做了两处更改,即确保日期检查发生在一个逻辑位置,外围括号括起来,并且我们在与datum列进行比较时使用了真正的日期。