计算日期列中的日期是否在开始日期和结束日期之间[Oracle SQL]

时间:2016-01-04 12:09:54

标签: sql oracle date count

这是我的第一篇文章,所以我希望我能正确发布这篇文章。

我的问题:

我想计算过去30天内每日活跃客户的数量。

到目前为止我所拥有的:

在第一栏中,我想今天打印,最后29天。我已经完成了

select distinct trunc(sysdate-dayincrement, 'DD') AS DATES
from   (
  select level as dayincrement
  from   dual
  connect by level <= 30
)

我已经在stackoverflow上把它拿起来了,它完美无缺。我甚至可以延长返回前的天数。 365天。完美!

我还有一个看起来像这样的表

|Cust# | Start date | End date  |
| 1000 | 01.01.2015 | 31.12.2015|
| 1001 | 02.01.2015 | 31.12.2016|
| 1002 | 02.01.2015 | 31.03.2015|
| 1003 | 03.01.2015 | 31.08.2015|

这是我觉得问题开始的地方

我想得到这个结果:

| Dates    | # of cust |
|04.01.2015|     4     |
|03.01.2015|     4     |
|02.01.2015|     3     |
|01.01.2015|     1     |

如果符合以下条件,查询将计为1:

  • 开始日期&lt; =日期
  • 结束日期&gt; =日期

否则计数为0.

我只是不知道如何构建查询。

我试过这个,但它没有用。

count(
  IF ENDDATE <= DATES THEN
    IF STARTDATE >= DATES THEN 1 ELSE 0 END IF
  ELSE
    0
  END IF
) AS CUST

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以编写一个等同于 IF-ELSE 构造的 CASE 表达式。

例如,

SQL> SELECT COUNT(
  2    CASE
  3      WHEN hiredate <= sysdate
  4      THEN 1
  5      ELSE 0
  6    END ) AS CUST
  7  FROM emp;

      CUST
----------
        14

SQL>

但是,看看您想要的输出,似乎只需要使用 COUNT GROUP BY 日期条件应位于过滤谓词

例如,

SELECT dates, COUNT(*) 
FROM   table_name
WHERE  dates BETWEEN start_date AND end_date
GROUP BY dates;

答案 1 :(得分:0)

以下产生您正在寻找的结果。我已将日期生成器更改为04-JAN- 2015 而非SYSDATE(当然,在 2016 中),并使用{{1包含'当前'日:

LEVEL-1

祝你好运。