You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL使用变量生成日期过滤查询返回0结果,问题何在?

MySQL查询无结果问题排查与解决

问题描述

我有一张包含year、month和price字段的表,尝试通过year与month字段生成日期变量来过滤表数据,执行的查询语句如下:

SELECT
@date_create := STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d'),`price`
FROM table
WHERE
@date_create >= '2023-05-01'

但MySQL返回0条结果,而实际应有结果,请问该查询存在什么问题?

核心问题

MySQL的执行逻辑是先执行WHERE子句过滤数据,再执行SELECT子句进行字段赋值与计算。你在WHERE中使用的@date_create变量,此时还未被SELECT里的语句赋值,它的值要么是会话残留的无效值,要么是NULL,根本无法匹配到符合条件的数据,所以返回空结果。

修正方案

方案一:直接在WHERE子句中生成判断条件

无需借助变量,直接在过滤逻辑里生成日期进行比较:

SELECT
  STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d') AS date_create,
  `price`
FROM `table`
WHERE STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d') >= '2023-05-01'

方案二:通过子查询先生成日期字段再过滤

先在子查询中生成完整的日期字段,再在外层查询中进行过滤:

SELECT date_create, price
FROM (
  SELECT
    STR_TO_DATE(CONCAT(`year`, '-', `month`, '-1'), '%Y-%m-%d') AS date_create,
    `price`
  FROM `table`
) AS temp_table
WHERE date_create >= '2023-05-01'

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:52:11