MySQL 在 CASE 语句中使用 date()

Posted

技术标签:

【中文标题】MySQL 在 CASE 语句中使用 date()【英文标题】:MySQL use date() in CASE statement 【发布时间】:2020-07-06 19:31:58 【问题描述】:

我正在尝试使用 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 吗? 【参考方案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 应该会返回一个解析错误——最新版本会这样。

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

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

【讨论】:

以上是关于MySQL 在 CASE 语句中使用 date()的主要内容,如果未能解决你的问题,请参考以下文章

Django使用Case手动控制排序

如何使用 case 语句中的函数返回值以选择每个函数的 MAX?

mysql中case使用

oracle sql case语句

如何在 MySQL 中使用 Case When 和 Str_to Date 将 Varchar 日期值转换为日期数据类型

Mysql 查询 - 在 case 语句中使用 Locate 函数按源对流量进行分组