mysql - 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';
解决方案
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 应该返回一个解析错误——最新版本确实如此。
我也强烈建议您不要使用单引号来分隔列。以下是三个原因:
- 您的列名很好,不需要转义。
- 单引号只能用于字符串和日期常量。
- 如果确实需要对标识符进行转义,则可以使用反引号。
推荐阅读
- javascript - 忽略仅包含空格的数组元素
- android - 预填充房间数据库会引发错误 - 架构似乎是错误的
- javascript - 无法读取 ExternalModuleFactoryPlugin.js:30 处未定义的属性“tapAsync”
- docker - org.apache.druid.java.util.common.ISE:未找到默认服务器
- java - 线程“主”java.lang.SecurityException 中的异常:禁止的包名称:java.io
- python - Pandas pd.to_datetime() 删除重复值
- java - 春季启动 @ComponentScan 与 @Import
- vue.js - 如何在 vuex 操作上使用 setTimeout?
- java - RabbitMQ+SpringAMPQ:代理不可用;在启动期间无法强制队列声明:java.net.ConnectException:连接被拒绝:连接
- asp.net-core - Blazor 合格名单
组件之间