首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >抓取多个日期范围的mysql查询

抓取多个日期范围的mysql查询
EN

Stack Overflow用户
提问于 2016-03-01 12:06:07
回答 3查看 2.3K关注 0票数 3

我似乎在提出一个问题来实现我想要的东西上有点麻烦。我有一张像下面这样的桌子。

代码语言:javascript
复制
| Date(TIMESTAMP)     | Count |
|---------------------|-------|
| 2016-02-01 01:00:00 | 52    |
| 2016-01-05 11:30:00 | 14    |
| 2016-02-01 04:20:00 | 36    |
| ...                 | ...   |

该表大约有40,000行。我想要做的是获取多个日期范围的总数,这样我就可以得到以下结果…

代码语言:javascript
复制
| Period     | Total |
|------------|-------|
| All        | 10245 |
| Past year  | 1401  |
| Past month | 104   |
| Past week  | 26    |

目前,我正在运行PHP脚本中的一个循环,并对要查找的每个日期范围执行单独的查询。实际上,我在每个循环中执行大约10个查询来获取不同的统计数据,但对于这个示例,我将其简化。这需要永远的时间,我希望有一种更优雅的方式来做这件事,然而我现在已经花了相当多的时间尝试不同的东西和研究,但一无所获。我知道如何使用案例进行分组,但不知道当一条记录可能需要放在多个存储箱中时。有什么帮助吗?

EN

回答 3

Stack Overflow用户

发布于 2016-03-01 12:11:42

尝试此UNION查询:

代码语言:javascript
复制
SELECT 'All', COUNT(*) AS Total FROM yourTable
UNION
SELECT 'Past year', COUNT(*) AS Total
FROM yourTable
WHERE DATE(TIMESTAMP) > DATE_ADD(NOW(), INTERVAL -1 YEAR)
UNION
SELECT 'Past month', COUNT(*) AS Total
FROM yourTable
WHERE DATE(TIMESTAMP) > DATE_ADD(NOW(), INTERVAL -1 MONTH)
UNION
SELECT 'Past week', COUNT(*) AS Total
FROM yourTable
WHERE DATE(TIMESTAMP) > DATE_ADD(NOW(), INTERVAL -1 WEEK)
票数 0
EN

Stack Overflow用户

发布于 2016-03-01 13:27:41

第一个。了解获取一年的第一个日期、一个月的第一个日期和一周的第一个日期的函数。然后使用count和filter将不同时期的第一个日期和最后一个日期组合成sql。

参考:

MySQL Select First Day of Year and Month

月份https://stackoverflow.com/a/19259159/1258492

week https://stackoverflow.com/a/11831133/1258492

代码语言:javascript
复制
select 'All' as period, count(1) from 
tbl
union

select 'Past Year' as period, count(1) from 
tbl
where timestamp between 
MAKEDATE(year(now())-1,1) and
last_day(MAKEDATE(year(now())-1,1) + interval 11 month)

union 

select 'Past Month' as period, count(1) from 
tbl
where timestamp between 
LAST_DAY(NOW() - INTERVAL 2 MONTH) + INTERVAL 1 DAY and
LAST_DAY(NOW() - INTERVAL 1 MONTH)

union 
select 'Past Week' as period, count(1) from 
tbl 
where timestamp between 
adddate(curdate(), INTERVAL 1-DAYOFWEEK(curdate())-7 DAY)  and
adddate(curdate(), INTERVAL 7-DAYOFWEEK(curdate())-7 DAY) ;

票数 0
EN

Stack Overflow用户

发布于 2018-07-01 00:22:54

您可以使用子查询。每次使用一个子查询,如下所示:

代码语言:javascript
复制
SELECT everything, 'past year'
FROM 
    (
     SELECT sum(c) AS 'everything' 
     FROM reports
    ) t1,
    (
    SELECT sum(c) AS 'past year'  
    FROM reports
    WHERE d  >= DATE_ADD(CURDATE(), INTERVAL -1 YEAR)
    ) t2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35714449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档