【问题标题】:MySQL use date() in CASE statementMySQL 在 CASE 语句中使用 date()
【发布时间】:2026-02-09 22:25:03
【问题描述】:

我正在尝试使用 MySQL 中的 date() 函数仅使用日期时间格式的日期来创建基于星期几的订单总数的案例。但是,当我运行此查询时,每个案例的值都是“0”。

select 
(CASE datetime WHEN date(datetime) = '2020-06-22' THEN count(order_id) ELSE 0 END) AS 'Mon'
,(CASE datetime WHEN date(datetime) = '2020-06-23' THEN count(order_id) ELSE 0 END) AS 'Tue'
,(CASE datetime WHEN date(datetime) = '2020-06-24' THEN count(order_id) ELSE 0 END) AS 'Wed'
,(CASE datetime WHEN date(datetime) = '2020-06-25' THEN count(order_id) ELSE 0 END) AS 'Thu'
,(CASE datetime WHEN date(datetime) = '2020-06-26' THEN count(order_id) ELSE 0 END) AS 'Fri'
from table;

当我运行以下查询时,我确认我确实得到了我想要的某个日期的输出。

select count(order_id) 
from table
where date(datetime) = '2020-06-22';

【问题讨论】:

  • - 你希望每个工作日的结果在一行还是一行
  • @BerndBuffen 我想将结果放在一行中,每个工作日有一列。
  • 这里不需要GROUP BY 吗?

标签: mysql sql date datetime case


【解决方案1】:

这样查询:

select
sum( if( weekday(datetime) = 0,1,0)) as 'Mon',
sum( if( weekday(datetime) = 1,1,0)) as 'Tue',
sum( if( weekday(datetime) = 2,1,0)) as 'Wed',
sum( if( weekday(datetime) = 3,1,0)) as 'Thu',
sum( if( weekday(datetime) = 4,1,0)) as 'Fri',
sum( if( weekday(datetime) = 5,1,0)) as 'Sat',
sum( if( weekday(datetime) = 6,1,0)) as 'Sun'

;

你可以使用一个

WHERE datetime BETWEEN '2020-06-22' AND '2020-06-26' 

如果你想得到一个日期范围

【讨论】:

    【解决方案2】:

    MySQL 有一个很好的特性,布尔值被视为数字,1 代表真,0 代表假。所以你可以将逻辑表达为:

    select sum( weekday(datetime) = 0 ) as Mon,
           sum( weekday(datetime) = 1 ) as Tue,
           sum( weekday(datetime) = 2 ) as Wed,
           sum( weekday(datetime) = 3 ) as Thu,
           sum( weekday(datetime) = 4 ) as Fri,
           sum( weekday(datetime) = 5 ) as Sat,
           sum( weekday(datetime) = 6 ) as Sun
    

    或者:

    select sum( date(datetime) = '2020-06-22' ) as Mon,
           sum( date(datetime) = '2020-06-23' ) as Tue,
           sum( date(datetime) = '2020-06-24' ) as Wed,
           sum( date(datetime) = '2020-06-25' ) as Thu,
           sum( date(datetime) = '2020-06-26' ) as Fri,
           sum( date(datetime) = '2020-06-27' ) as Sat,
           sum( date(datetime) = '2020-06-28' ) as Sun
    

    您的查询不起作用,因为它是一个聚合查询(COUNT()),但您在 SELECT 中有未聚合的列。 MySQL 应该会返回一个解析错误——最新版本会这样。

    我也强烈建议您不要使用单引号来分隔列。以下是三个原因:

    • 您的列名很好,不需要转义。
    • 单引号只能用于字符串和日期常量。
    • 如果确实需要对标识符进行转义,则可以使用反引号。

    【讨论】: