【问题标题】:Counting all rows in column with two different date conditions使用两个不同的日期条件计算列中的所有行
【发布时间】:2020-03-30 07:52:08
【问题描述】:

我正在尝试将两个带有日期条件的计数查询(如下)转换为一个查询。

SELECT COUNT(*) as yesterday FROM orders WHERE DATE(timedate) = DATE(NOW() - INTERVAL 1 DAY)
SELECT COUNT(*) as yesterday FROM orders WHERE DATE(timedate) = DATE(NOW() - INTERVAL 2 DAY)

Following the advice of another answer 我创建了以下内容,但这似乎在语法方面不起作用,我不太清楚为什么。还有其他方法可以做到这一点吗?我找不到类似的问题

SELECT 
    SUM(IF(DATE(timedate) = DATE(NOW() - INTERVAL 1 DAY))) AS testcount1,
    SUM(IF(DATE(timedate) = DATE(NOW() - INTERVAL 2 DAY))) AS testcount2
FROM 
    orders

【问题讨论】:

标签: mysql sql date group-by mariadb


【解决方案1】:

您缺少IF 表达式的输出值。你也应该使用CURRENT_DATE(),这样你就不需要转换成DATE

SELECT 
    SUM(IF(DATE(timedate) = CURRENT_DATE() - INTERVAL 1 DAY, 1, 0)) AS testcount1,
    SUM(IF(DATE(timedate) = CURRENT_DATE() - INTERVAL 2 DAY, 1, 0)) AS testcount2
FROM 
    orders

请注意,MySQL 在数字上下文中将布尔表达式视为 1 (true) 或 0 (false),因此您实际上可以在不需要 IF 的情况下使用 SUM 表达式:

SELECT 
    SUM(DATE(timedate) = CURRENT_DATE() - INTERVAL 1 DAY) AS testcount1,
    SUM(DATE(timedate) = CURRENT_DATE() - INTERVAL 2 DAY) AS testcount2
FROM 
    orders

【讨论】:

    【解决方案2】:

    您需要条件聚合。我将查询语句如下:

    SELECT 
        SUM(
            timedate >= CURRENT_DATE - INTERVAL 1 DAY
            and timedate < CURRENT_DATE
        ) AS testcount1,
        SUM(
            timedate >= CURRENT_DATE - INTERVAL 2 DAY
            and timedate < CURRENT_DATE- INTERVAL 1 DAT
        ) AS testcount2
    FROM orders
    

    详情:

    • 这使用了 MySQL 的一个很好的特性,它在数字上下文中将 false/true 条件评估为 0/1

    • timedate 列上没有应用日期函数:相反,我们进行逐字日期比较。这样效率更高,因为数据库可能会利用日期时间列上的索引

    您可能还想在查询中添加WHERE 子句:

    WHERE 
        timedate >= CURRENT_DATE - INTERVAL 2 day
        AND timedate< CURRENT_DATE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多