首页 > 解决方案 > MySQL 在 CASE 语句中使用 date()

问题描述

我正在尝试使用 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';

标签: mysqlsqldatedatetimecase

解决方案


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 应该返回一个解析错误——最新版本确实如此。

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

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

推荐阅读