两变量相减返回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
相关产品推荐
相关产品推荐

