Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否使用SQL查询对日期范围内的项目进行计数?_Sql_Date_Db2_Datefilter - Fatal编程技术网

是否使用SQL查询对日期范围内的项目进行计数?

是否使用SQL查询对日期范围内的项目进行计数?,sql,date,db2,datefilter,Sql,Date,Db2,Datefilter,首先,我知道这一点足以让自己陷入困境。我正在为AS/400系统编写一个查询。我有一个包含开始日期和结束日期的文件。我要做的是创建一个查询,该查询可以计算在一个日期范围内打开了多少行项目。(对于我的应用程序,打开的定义为:DATE>START\u DATE和(DATE='20200210' 或结束日期='0' ) 这很好,但很耗时。从这里开始,我不知道如何转换到所需的输出…或者即使可能…但这将加快我的速度。提前感谢 另外,欢迎您提供任何帮助,如果您知道如何在mySQL等中实现这一点,请与我们分享

首先,我知道这一点足以让自己陷入困境。我正在为AS/400系统编写一个查询。我有一个包含开始日期和结束日期的文件。我要做的是创建一个查询,该查询可以计算在一个日期范围内打开了多少行项目。(对于我的应用程序,打开的定义为:
DATE>START\u DATE
和(
DATE='20200210'
或结束日期='0'
)
这很好,但很耗时。从这里开始,我不知道如何转换到所需的输出…或者即使可能…但这将加快我的速度。提前感谢

另外,欢迎您提供任何帮助,如果您知道如何在mySQL等中实现这一点,请与我们分享。我可以接受这些帮助,并与它一起运行,以使其在AS/400中发挥作用。这就是我现在所处的位置

****************编辑以进行澄清 1.现行守则 提供的当天代码就是我的全部。我不知道从哪里开始 根据我的要求。 2.示例数据:

Line Item       START_DATE        END_DATE
1               20200206          20200210
2               20200207          20200210
3               20200207          20200207
  • 预期产出:
  • DBMS我已经更新了标签以包含DB2.5。我不相信GROUPBY会起作用。
    基本上,我希望这是一个迭代式的计算方式。从我的python/java背景来看,这对我来说是有意义的。我不是在寻找5天前打开的所有内容,我想从5天前开始,计算这5天中每一天打开了多少行项目。如果这在GROUP中确实是可能的,请详细说明同时,我将开始为达到这一目的而进行分组
  • 请试试这个:

    SELECT COUNT(*) FROM MYFILE WHERE (START_DATE < '20200205' AND (END_DATE >= '20200210' OR END_DATE = '0')) GROUP BY DATE_FORMAT(START_DATE , '%Y%m%d')
    
    从MYFILE中选择计数(*),其中(开始日期<'20200205'和(结束日期>='20200210'或结束日期='0')按日期分组格式(开始日期,'%Y%m%d'))
    
    听起来像是
    group by
    语句的一个简单用法,但您没有说明分组依据的列,只是一个日期,我假设是开始日期

    我不知道AS/400 SQL,所以我将有点抽象,并假设CURRENT_DATE()返回您所在地区的当前日期。RDBMS在这方面有所不同

    考虑到这些假设,以下内容应该会有所帮助:

    
    挑选
    开始日期为日期,
    将(*)计算为打开状态
    从…起
    我的文件
    哪里
    开始日期>=(当前日期()-5)
    及(
    结束日期>=(当前日期()-5)
    或结束日期='0'
    )
    分组
    开始日期
    
    取消激活数据并使用窗口函数进行聚合。以下是想法:

    with se as (
          select dte, sum(ins) as ins, sum(outs) as outs
          from ((select start_date as dte, count(*) as ins, 0 as outs
                 from t
                ) union all
                (select end_date, 0, count(*) as outs
                 from t
                )
               )
    select dte, ins, outs,
           (sum(sum(ins)) over (order by dte) -
            sum(sum(outs)) over (order by dte)
           )
    from se
    order by dte;
    
    这将一天的所有开始相加,并减去结束数

    注:

    • 如果要按日期筛选,请将筛选逻辑放在外部查询中
    • 这假设所有日期都是有效的。如果某些日期是特殊的,则需要在订购人中考虑到这一点
    • 这不计算某人离开当天的天数。如果要计算他们,只需将子查询中的
      结束日期添加到1天即可

      • 下面是一个查询,返回给定日期和给定日期之间的连续日期-5天。当然,您可以使用
        当前日期
        而不是此常量

        WITH T (DT) AS 
        (
        VALUES DATE('2020-02-13') - 5 DAYS
          UNION ALL
        SELECT DT + 1 DAY
        FROM T 
        WHERE DT < DATE('2020-02-13')
        )
        SELECT DT FROM T;
        

        这种“虚拟表”的进一步使用是显而易见的:您可以
        B.START\u DATEDBMS
        ?请用它标记您的问题(我想您提到的是
        mySQL
        )如果我没有弄错AS/400是IBM提供的DB2对吗?如果是这样的话,你能用DB2更新问号吗?选择M.MY_DAY,COUNT(*)FROM(选择DISTINCT(START_DATE)作为MYFILE的MY_DAY FROM,其中START_DATE>=REPLACE(CHAR(CURRENT DATE-5 DAY,ISO),“-”,ORDER by START by START_DATE)作为M LEFT加入MYFILE P ON M.MY_DAY>P.START_DATE和(M.MY_DAY那是最后一个问题。谢谢你的帮助,我不知道加入条件可以这样使用。我给了你一张赞成票,但我太新了,我的票无法计算。
        with se as (
              select dte, sum(ins) as ins, sum(outs) as outs
              from ((select start_date as dte, count(*) as ins, 0 as outs
                     from t
                    ) union all
                    (select end_date, 0, count(*) as outs
                     from t
                    )
                   )
        select dte, ins, outs,
               (sum(sum(ins)) over (order by dte) -
                sum(sum(outs)) over (order by dte)
               )
        from se
        order by dte;
        
        WITH T (DT) AS 
        (
        VALUES DATE('2020-02-13') - 5 DAYS
          UNION ALL
        SELECT DT + 1 DAY
        FROM T 
        WHERE DT < DATE('2020-02-13')
        )
        SELECT DT FROM T;
        
        |DT        |
        |----------|
        |2020-02-08|
        |2020-02-09|
        |2020-02-10|
        |2020-02-11|
        |2020-02-12|
        |2020-02-13|