带JOIN的SQL查询中使用DECLARE声明变量获取昨日数据报错及替代方案咨询
带JOIN的SQL查询中使用DECLARE声明变量获取昨日数据报错及替代方案咨询
看起来你遇到了两个问题:一个是DECLARE的语法错误,另一个是WHERE条件的逻辑问题,我来帮你一步步解决:
首先修正逻辑错误
你当前的WHERE条件写反了:
WHERE ------.DATE_TIME >= @today AND -----.DATE_TIME < DATEADD(DAY, -1, @today)
这个条件要求数据时间大于等于今天,同时小于昨天,这是不可能存在的范围,所以即使语法修复了也查不到任何结果。
正确的昨日数据范围应该是昨天00:00:00 到今天00:00:00之间的所有数据,条件需要调整为“大于等于昨天0点,且小于今天0点”。
解决DECLARE语法报错问题
报错提示incorrect syntax near "DECLARE",说明你当前使用的SQL环境(数据库类型、查询工具)不支持这种变量声明方式,或者变量的位置不符合规则。之前单表查询时能用,可能是当时的查询上下文允许这种写法,但带JOIN的查询有不同的解析逻辑。
给你两种实用的解决方案:
方案1:不使用变量,直接在WHERE中计算日期(兼容性最强)
这种写法不需要声明变量,直接在条件里计算日期边界,几乎适配所有支持日期函数的数据库,也避免了变量带来的语法问题:
SELECT * FROM ------ LEFT JOIN ----- ON ------ = ---- -- 用CAST(GETDATE() AS DATE)获取今天的0点,DATEADD往前推1天得到昨天0点 WHERE ------.DATE_TIME >= DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) AND ------.DATE_TIME < CAST(GETDATE() AS DATE)
方案2:适配数据库的变量声明语法
如果你一定要用变量,可以根据你使用的数据库类型调整写法:
- SQL Server(你之前可能用的这个,原生支持
DECLARE):确保变量声明在查询最开头,同时修正条件:
DECLARE @today date = CAST(GETDATE() AS DATE); -- 转成日期类型,去掉时间部分干扰 SELECT * FROM ------ LEFT JOIN ----- ON ------ = ---- WHERE ------.DATE_TIME >= DATEADD(DAY, -1, @today) AND ------.DATE_TIME < @today;
- MySQL:用
SET声明变量:
SET @today = CURDATE(); SELECT * FROM ------ LEFT JOIN ----- ON ------ = ---- WHERE ------.DATE_TIME >= DATE_SUB(@today, INTERVAL 1 DAY) AND ------.DATE_TIME < @today;
- PostgreSQL:无需变量,直接用内置日期函数:
SELECT * FROM ------ LEFT JOIN ----- ON ------ = ---- WHERE ------.DATE_TIME >= CURRENT_DATE - INTERVAL '1 day' AND ------.DATE_TIME < CURRENT_DATE;
如果还是不确定自己使用的数据库类型,可以补充更多环境信息,这样能给出更精准的解决方案。
备注:内容来源于stack exchange,提问作者Dbrooks53
相关产品推荐
相关产品推荐

