用于获取多个日期范围的 mysql 查询

Posted

技术标签:

【中文标题】用于获取多个日期范围的 mysql 查询【英文标题】:mysql query for grabbing multiple date ranges 【发布时间】:2016-03-01 04:06:07 【问题描述】:

我似乎在提出查询以实现我想要的结果时遇到了一些麻烦。我有一张如下表..

| 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 行。我想做的是获取多个日期范围的总数,所以我最终得到以下...

| Period     | Total |
|------------|-------|
| All        | 10245 |
| Past year  | 1401  |
| Past month | 104   |
| Past week  | 26    |

目前,我在我的 php 脚本中运行一个循环,并对我正在寻找的每个日期范围进行单独的查询。实际上,每个循环我正在执行大约 10 个查询来获取不同的统计信息,但对于示例,我正在简化它。这需要很长时间,我希望有一种更优雅的方式来做到这一点,但是我现在花了很多时间尝试不同的事情和研究,但一无所获。我了解如何使用 CASE 进行分组,但当一条记录可能需要放在多个 bin 中时,我不知道。有什么帮助吗?

【问题讨论】:

【参考方案1】:

试试这个UNION 查询:

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)

【讨论】:

【参考方案2】:

第一。了解获取一年中的第一个日期、一个月的第一个日期和一周的第一个日期的功能。 然后使用计数和过滤器组成您的 sql,并使用不同时期的第一个和最后一个日期。

参考:

mysql Select First Day of Year and Month

月 https://***.com/a/19259159/1258492

周https://***.com/a/11831133/1258492

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) ;

【讨论】:

【参考方案3】:

您可以使用子查询。每个时间细分使用一个子查询,如下所示:

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

【讨论】:

以上是关于用于获取多个日期范围的 mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

用于显示多个日期范围之间的间隔的 SQL 查询

MySQL查询以获取日期范围内的端点?

需要将日期范围转换为 MySQL 中的多个日期条目

SQL 查询 - 多个日期范围

Cloud Firestore-文档具有日期范围的日期范围查询

我在表单中使用了日期范围选择器如何禁用从 MySQL 数据库中获取的特定日期范围