如何使用开始和结束日期计算每天的实际数字?

时间:2019-04-01 07:11:27

标签: sql oracle

我需要计算每个日期的唯一ID数。有没有办法仅使用SQL而不使用PL / SQL?

func classFromString(className: String) -> AnyClass! {
    let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String;
    let class1: AnyClass = NSClassFromString("\(namespace).\(className)")!;
    return class1;
}

我需要一个create table test ( id number(10), start_date timestamp, end_date timestamp ); insert into test values(1, to_date('01.01.2019', 'dd.mm.yyyy'), to_date('03.01.2019', 'dd.mm.yyyy')); insert into test values(2, to_date('02.01.2019', 'dd.mm.yyyy'), to_date('05.01.2019', 'dd.mm.yyyy')); insert into test values(3, to_date('04.01.2019', 'dd.mm.yyyy'), to_date('06.01.2019', 'dd.mm.yyyy')); 语句才能获得如下信息:

SELECT

3 个答案:

答案 0 :(得分:2)

另一种尝试使用cte递归的方法

WITH   CTE(id,start_date,end_date) AS
(
        SELECT  id,start_date ,end_date
        FROM test
        UNION ALL
        SELECT id,start_date ,cast((end_date - 1) as date)
        FROM CTE 
        WHERE start_date <= cast((end_date - 1) as date)
)
SELECT  end_date,COUNT(*)
FROM    CTE
GROUP BY end_date
ORDER BY end_date

sqlfiddle

或使用CONNECT BY

SELECT dt,count(*)
FROM ( 
    SELECT DISTINCT end_date,start_date + LEVEL dt
    FROM    test
    CONNECT BY extract(day from end_date - start_date) - LEVEL + 1 >= 0
) t1
GROUP BY dt
ORDER BY dt

sqlfiddle

答案 1 :(得分:1)

解决此问题的关键是生成一个日期列表,您要为其计算不同ID的数量。然后,您可以简单地将JOIN与列表一起使用此表,然后启用聚合。

这是一个简单的解决方案,它可以根据原始表的两个包含日期的列中的可用值来构建日期列表。使用递归子查询或日历表还可以使用其他(更好)的选项。

SELECT dt.mydate, COUNT(DISTINCT id_number) cnt
FROM
    ( 
        SELECT DISTINCT start_date mydate FROM test 
        UNION ALL SELECT DISTINCT end_date  FROM test 
    ) dt
    LEFT JOIN test t ON dt.mydate >= t.start_date AND dt.mydate <= t.end_date
GROUP BY dt.mydate
ORDER BY dt.mydate

demo on DB Fiddle 及其示例数据将返回:

MYDATE                       | CNT
:--------------------------- | --:
01-JAN-19 12.00.00.000000 AM |   1
02-JAN-19 12.00.00.000000 AM |   2
03-JAN-19 12.00.00.000000 AM |   2
04-JAN-19 12.00.00.000000 AM |   2
05-JAN-19 12.00.00.000000 AM |   2
06-JAN-19 12.00.00.000000 AM |   1

答案 2 :(得分:0)

SELECT start_date,COUNT(Id_number) from test group by start_date

通过这种方式,您可以按日期(开始日期或结束日期,任意选择)对行进行分组,并对具有相同日期的行进行计数。

我希望它能对您有所帮助。