mysql - 选择两个日期之间的日期范围并获取计数

标签 mysql sql date

我有一张 table (名字是vcar)

id  | createddatetime    | 
--------------------------
1   |2016-08-20 17:23:53 |
2   |2016-08-20 17:23:53 |
3   |2016-08-20 17:23:53 |
4   |2016-08-20 17:23:53 |
4   |2016-08-20 17:23:53 |
4   |2016-08-21 17:23:53 |
3   |2016-08-21 17:23:53 |
1   |2016-08-21 17:23:53 |
1   |2016-08-21 17:23:53 |
2   |2016-08-24 17:23:53 |
3   |2016-08-24 17:23:53 |
4   |2016-08-24 17:23:53 |
2   |2016-08-29 17:23:53 |
2   |2016-08-29 17:23:53 |
3   |2016-08-29 17:23:53 |
4   |2016-08-29 17:23:53 |
4   |2016-08-30 17:23:53 |
2   |2016-08-30 17:23:53 |
3   |2016-08-30 17:23:53 |
4   |2016-08-30 17:23:53 |

我尝试使用

获取特定日期范围中的 ID 计数
SELECT
 count(CAST(createddatetime AS DATE)),
 CAST(createddatetime AS DATE),
 DAYNAME(CAST(createddatetime AS DATE)) 
FROM vcar 
WHERE
CAST(createddatetime AS DATE)>=date('2016-08-20') AND 
CAST(createddatetime AS DATE)<=date('2016-08-35') 
GROUP BY CAST(createddatetime AS DATE);

这给了我 o/p ,但我还需要显示在特定日期点击次数为零的日期。如何做到这一点?

O/p 我得到了

-------------------------------------- ------------------------------- ----------------------------------------

     count(CAST(createddatetime AS DATE)) | CAST(createddatetime AS DATE) | DAYNAME(CAST(createddatetime AS DATE)) |

        -------------------------------------- ------------------------------- ----------------------------------------
                                            9 | 2016-08-20                    | Saturday                               |
                                           36 | 2016-08-23                    | Tuesday                                |
                                            4 | 2016-08-24                    | Wednesday                              |
        -------------------------------------- ------------------------------- ----------------------------------------

我需要什么

-------------------------------------- ------------------------------- ----------------------------------------
 count(CAST(createddatetime AS DATE)) | CAST(createddatetime AS DATE) | DAYNAME(CAST(createddatetime AS DATE)) |
-------------------------------------- ------------------------------- ----------------------------------------
                                    9 | 2016-08-20                    | Saturday                               |
                                    0 | 2016-08-21                    | Sunday                                 |
                                    0 | 2016-08-22                    | Monday                                 |
                                   36 | 2016-08-23                    | Tuesday                                |
                                    4 | 2016-08-24                    | Wednesday                              |
                                    9 | 2016-08-25                    | Thursday                               |
                                    0 | 2016-08-26                    | Friday                                 |                        
-------------------------------------- ------------------------------- ----------------------------------------

最佳答案

日历表会使这变得容易得多。既然你没有,那么下面的查询就可以完成这项工作。

SELECT 
dateTable.day,
DAYNAME(dateTable.day) AS dayName,
COALESCE(yourQuery.total,0) AS cnt
FROM 
(
    SELECT ADDDATE('2016-08-20', INTERVAL @i:=@i+1 DAY) AS DAY
    FROM (
    SELECT a.a
    FROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS a
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS b
    CROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c
    ) a
    JOIN (SELECT @i := -1) r1
    WHERE 
    @i < DATEDIFF('2016-08-31', '2016-08-20')
) AS dateTable
LEFT JOIN
(
    SELECT
        DATE(createddatetime) date,
        count(id) As total
    FROM vcar 
    WHERE DATE(createddatetime) BETWEEN '2016-08-20' AND '2016-08-31'
    GROUP BY date
) AS yourQuery
ON dateTable.day = yourQuery.date 
ORDER BY dateTable.day

注意:

dateTable 别名内的查询将生成从 2016-08-202016-08-31 的日期。

Check this

关于mysql - 选择两个日期之间的日期范围并获取计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39242550/

相关文章:

php - 数据库活在过去?

MySql 查询 : How to Write Inner Select Join Query

mysql - OTRS SQL 框 "Executing OS Commands"

android - 无法使用来自远程服务器数据库的数据填充 Spinner

sql - 我想了解以下字符串如何介于其他 2 个字符串之间

php 特定日期后的第一个星期一作为字符串

MySQL 当天的最后一个值

mysql - 您将如何使 MySQL 记录过期(或更新)并精确到过期时间?

sql - PROC SQL 类操作符

SQLite 接受 SQL 语法中不存在的连接类型