【问题标题】:Get specific data from 2 date for a timerange从时间范围内的 2 个日期获取特定数据
【发布时间】:2017-03-23 12:21:26
【问题描述】:

数据以 UTC 格式存储在 DB 中,我必须将本地转换为 UTC 获取它然后在本地时间显示结果。 现在我来自印度,所以如果我想搜索今天的数据,我必须从 3 月 22 日 6:30 PM UTC 到 3 月 23 日 6:30 PM UTC 进行查询。现在假设我想检查一周中的每一天的数据,直到现在是 4:30 PM local 。现在我写了这个查询[简单来说,我的目标是获取每天上午 12 点到下午 4:30 的访客人数]

SELECT
            FLOOR(TIMESTAMPDIFF(HOUR, "2017-03-16 18:29:59",
            visit.date_created)/24) as dayofweek,
            DAYOFWEEK(visit.date_created) day_num,
   @rownum := @rownum + 1 as date_created_set_av,
            count(distinct(visit.pkey)) AS Visits,
            sum(revenue) AS Revenue,
            sum(revenue) / count(distinct(visit.pkey)) as EPC
            FROM la_20.visit, la_20.action 
            cross join (select @rownum := 0) r   
            WHERE visit.pkey=action.pkey  and (visit.is_bot = 0)
            AND visit.date_created >="2017-03-16 18:29:59" 
            AND visit.date_created <="2017-03-23 18:29:59"  
            AND TIME(visit.date_created)<="16:30:00"
   GROUP BY dayofweek order by day_num

但它所做的是从 2017-03-23 00:00:00 到 2017-03-23 16:30:00 获取值。我需要的是从 18:29:59 到 16:30:00 显示每天 16 到 23 日数据的结果。请记住,我需要每天而不是一天的结果。谁能帮忙

【问题讨论】:

    标签: mysql sql datetime


    【解决方案1】:

    你应该把你的 WHERE 子句改成

    WHERE visit.pkey=action.pkey  and (visit.is_bot = 0)
    AND visit.date_created >="2017-03-22 18:29:59" and visit.date_created <="2017-03-23 14:29:59"  
    

    更新

    • 今天午夜:DATEADD(d,0,DATEDIFF(d,0,GETDATE()))
    • 今天下午 4 点:DATEADD(HOUR, 16, DATEADD(d,0,DATEDIFF(d,0,GETDATE())))

      WHERE visit.pkey=action.pkey  and (visit.is_bot = 0)
      AND visit.date_created >= DATEADD(d,0,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d,0,DATEDIFF(d,0,GETDATE())))
      

    更新 2: 然后我猜你必须像这样扩展你的 where 子句。

    WHERE visit.pkey=action.pkey  and (visit.is_bot = 0)
    AND (
        (visit.date_created >= DATEADD(d, 0,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d, 0,DATEDIFF(d,0,GETDATE()))))
     OR (visit.date_created >= DATEADD(d,-1,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d,-1,DATEDIFF(d,0,GETDATE()))))
     OR (visit.date_created >= DATEADD(d,-2,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d,-2,DATEDIFF(d,0,GETDATE()))))
     OR (visit.date_created >= DATEADD(d,-3,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d,-3,DATEDIFF(d,0,GETDATE()))))
     OR (visit.date_created >= DATEADD(d,-4,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d,-4,DATEDIFF(d,0,GETDATE()))))
     OR (visit.date_created >= DATEADD(d,-5,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d,-5,DATEDIFF(d,0,GETDATE()))))
     OR (visit.date_created >= DATEADD(d,-6,DATEDIFF(d,0,GETDATE())) and visit.date_created <= DATEADD(HOUR, 16, DATEADD(d,-6,DATEDIFF(d,0,GETDATE()))))
     )
    

    【讨论】:

    • 我稍微编辑了我的问题,我想要的是在一个特定的实例上,比如当地时间下午 4:00 我想检查每天的数据,所以午夜 12:00 到中午 4:00我想看看每天的数据。现在它的作用是显示今天的数据直到 4:00,但对于其他人它显示一整天的数据
    • 我的问题可能不清楚 1) 我正在尝试检索 7 天的结果 2) 我想显示每天午夜 12 点到下午 4 点的数据所以例如在下午 4 点访问者是什么一周中的每一天,今天,昨天,前天等等。感谢您花时间回答我的问题
    • OP 是否需要 SQL-Server 或 Mysql 的解决方案?该标签建议使用 MySql,但话又说回来,他似乎也喜欢您的 SQL-Server 解决方案...... ;-)
    【解决方案2】:

    您是否尝试过以下 where 子句?

    WHERE visit.pkey=action.pkey and (visit.is_bot = 0)
            AND visit.date_created >="2017-03-22 18:29:59" 
            AND visit.date_created <="2017-03-23 14:29:59"  
    

    3.编辑
    好的,因为 OP 再次想要一些不同的东西 - 为什么不;-) - 这是另一个可能(或可能不会)解决他的问题的解决方案:

    SELECT 
     COUNT( CASE WHEN d between 
            adddate(curdate(), interval -7 day) AND addtime(adddate(curdate(), interval -7 day),'16:00:00')
                 THEN 1 END ) dm7,
     COUNT( CASE WHEN d between 
            adddate(curdate(), interval -6 day) AND addtime(adddate(curdate(), interval -6 day),'16:00:00')
                 THEN 1 END ) dm6,
     COUNT( CASE WHEN d between 
            adddate(curdate(), interval -5 day) AND addtime(adddate(curdate(), interval -5 day),'16:00:00')
                 THEN 1 END ) dm5,
     COUNT( CASE WHEN d between 
            adddate(curdate(), interval -4 day) AND addtime(adddate(curdate(), interval -4 day),'16:00:00')
                 THEN 1 END ) dm4,
     COUNT( CASE WHEN d between 
            adddate(curdate(), interval -3 day) AND addtime(adddate(curdate(), interval -3 day),'16:00:00')
                 THEN 1 END ) dm3,
     COUNT( CASE WHEN d between 
            adddate(curdate(), interval -2 day) AND addtime(adddate(curdate(), interval -2 day),'16:00:00')
                 THEN 1 END ) dm2,
     COUNT( CASE WHEN d between 
            adddate(curdate(), interval -1 day) AND addtime(adddate(curdate(), interval -1 day),'16:00:00')
                 THEN 1 END ) dm1,
     COUNT( CASE WHEN d between 
                    curdate()                   AND addtime(        curdate()                  ,'16:00:00')
                 THEN 1 END ) today
    FROM (select     '2017-03-17 15:00:01' d
    union all select '2017-03-19 14:00:01'
    union all select '2017-03-19 12:00:01'
    union all select '2017-03-19 13:00:01'
    union all select '2017-03-19 11:00:01'
    union all select '2017-03-20 11:20:01'
    union all select '2017-03-20 11:30:01'
    union all select '2017-03-20 10:40:01'
    union all select '2017-03-20 10:23:01' ) dates
    

    这是一个独立的查询,直接作用于子查询中给出的样本数据。它会产生以下列表(“dm1”=day 减 1):

    dm7 | dm6 | dm5 | dm4 | dm3 | dm2 | dm1 | today
      1 |   0 |   4 |   4 |   0 |   0 |   0 |     0
    

    你可以在这里测试它:http://rextester.com/ITLBL24540

    【讨论】:

    • 我稍微编辑了我的问题,我想要的是在一个特定的实例上,比如当地时间下午 4:00 我想检查每天的数据,所以午夜 12:00 到中午 4:00我想看看每天的数据。现在它的作用是显示今天的数据,直到 4:00,但对于其他人,它显示一整天的数据。
    • 我的问题可能不清楚 1) 我正在尝试检索 7 天的结果 2) 我想显示每天午夜 12 点到下午 4 点的数据所以例如在下午 4 点访问者是什么一周中的每一天,今天,昨天,前天等等。感谢您花时间回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2012-08-13
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多