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

两变量相减返回Null的问题咨询及相关SQL代码解析

我来帮你拆解这个问题,你的SQL里有两个关键错误导致了变量相减返回Null的问题,咱们一步步排查和修复:

问题原因与解决方案

1. Part1 踩了MySQL变量赋值的语法坑

在MySQL中,用SELECT语句给用户变量赋值时,不能用=,必须用:=!因为=在SELECT语境里是比较运算符,不是赋值符号。你写的这两行:

SELECT @NUM_OF_DAYS = (@SEC_IN_END_DATE - @SEC_IN_START_DATE);
SELECT @NUM_OF_WEEKS = (@NUM_OF_DAYS%7);

本质上是在做“变量是否等于某个值”的比较,根本没给变量赋值,所以@NUM_OF_DAYS和@NUM_OF_WEEKS始终是未初始化的Null。

Part1 修复方案

两种写法都可以,推荐用SET更直观:

-- 写法1:用SET赋值(更清晰)
SET @NUM_OF_DAYS = @SEC_IN_END_DATE - @SEC_IN_START_DATE;
SET @NUM_OF_WEEKS = @NUM_OF_DAYS % 7;

-- 写法2:用SELECT + :=赋值
SELECT @NUM_OF_DAYS := (@SEC_IN_END_DATE - @SEC_IN_START_DATE);
SELECT @NUM_OF_WEEKS := (@NUM_OF_DAYS % 7);

2. Part2 变量名拼写不一致

你前面定义的变量是@STARTDATE和@ENDDATE(没有下划线),但Part2里写成了@START_DATE和@END_DATE(多了下划线)。MySQL的用户变量是严格匹配名称的,未定义的变量直接返回Null,导致整个计算式结果为Null。

Part2 修复方案

把变量名改成和前面一致的即可:

SELECT ROUND(( (unix_timestamp(@ENDDATE) - unix_timestamp(@STARTDATE) ) /(24*60*60) -7+WEEKDAY(@STARTDATE)-WEEKDAY(@ENDDATE) )/7);

完整可运行代码

把所有错误修正后,完整代码如下:

SELECT DAYOFWEEK('2018/08/15');
SET @STARTDATE = '2017/08/15';
SET @ENDDATE = '2018/08/15';

-- 修正后的Part1
SET @SEC_IN_START_DATE = UNIX_TIMESTAMP(@STARTDATE);
SET @SEC_IN_END_DATE = UNIX_TIMESTAMP(@ENDDATE);
SET @NUM_OF_DAYS = @SEC_IN_END_DATE - @SEC_IN_START_DATE;
SET @NUM_OF_WEEKS = @NUM_OF_DAYS % 7;
SELECT @NUM_OF_DAYS, @NUM_OF_WEEKS; -- 可以查看计算结果
SELECT UNIX_TIMESTAMP(@ENDDATE);

-- 修正后的Part2
SELECT ROUND(( (unix_timestamp(@ENDDATE) - unix_timestamp(@STARTDATE) ) /(24*60*60) -7+WEEKDAY(@STARTDATE)-WEEKDAY(@ENDDATE) )/7);

额外小技巧

如果是计算两个日期的周数差,其实MySQL自带的TIMESTAMPDIFF()函数可以直接搞定,比手动算时间戳简单多了,结果和你Part2的逻辑一致:

SELECT TIMESTAMPDIFF(WEEK, @STARTDATE, @ENDDATE);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:49:37