mysql - 需要在具有开始日期和结束日期的选定日期之间按天列出活跃客户列表(也为空)

标签 mysql sql

我们需要第一天和第二天之间没有活跃客户的结果

客户的开始日期和结束日期有时结束日期为空,我希望两个日期之间的活跃客户逐日结果

cust    strdate         end
1     2018-01-01      null
2     2018-01-01    2018-01-03
3     2018-01-02    2018-01-02
4     2018-01-04     null

我的外部通过日期 2018-01-01 至 2018-01-04 的结果

day         count
2018-01-01    2
2018-01-02    3
2018-01-03    2
2018-01-04    2

最佳答案

一个选项使用日历表来表示您想要查看的所有日期。出于示例数据的目的,我们可以将日期硬编码到 CTE 中。对于实际数据,您可能希望生成一个日期范围。这意味着下面别名为 d 的子查询将被替换为包含要包含在查询中的日期范围的实际表/ View 。

SELECT
    d.date,
    COUNT(*) AS count
FROM
(
    SELECT '2018-01-01' AS date UNION ALL
    SELECT '2018-01-02' UNION ALL
    SELECT '2018-01-03' UNION ALL
    SELECT '2018-01-04'
) d
LEFT JOIN yourTable t
    ON d.date >= t.strdate AND (d.date <= t.enddate OR t.enddate IS NULL)
GROUP BY
    d.date
ORDER BY
    d.date;

enter image description here

Demo

此答案假设如果结束日期为NULL,则意味着范围的右侧完全开放,即所有日期都将匹配,前提是它们的开始日期也在范围内。

关于mysql - 需要在具有开始日期和结束日期的选定日期之间按天列出活跃客户列表(也为空),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52697498/

相关文章:

php - mysql查询中的二维数组

mysql - 区分重复 key 和更新 key

php - mysql inner join查询给一行三次

mysql - 设置表结构

MySQL别名问题

mysql - SQL 查询从数据表中选择不同的值以及相应的列值

SQL 基于时间的触发器

mysql - 如果运行时查询中参数值为 NULL,如何设置参数值

mysql - 如何让这个查询正确?

C# 组合框选择提供另一个组合框