使用AND与datediff时的SQL问题:WHERE无法识别别名date_diff
解决方法
在SQL中,WHERE子句的执行顺序早于SELECT子句,所以你在SELECT里定义的别名date_diff无法在WHERE中直接使用。针对你的需求(排除日期差为0的行),可以用以下两种方式解决:
方式一:在WHERE中重复日期差计算表达式
直接把datediff(log_in, date_opened)的计算逻辑写到WHERE条件里,替代别名:
select first_name, log_in, date_opened, datediff(log_in, date_opened) as date_diff from table1 where log_in < date_opened and datediff(log_in, date_opened) > 0;
方式二:使用子查询或CTE先计算别名列
先通过子查询或CTE生成包含date_diff的中间结果,再对中间结果进行筛选:
子查询写法
select first_name, log_in, date_opened, date_diff from ( select first_name, log_in, date_opened, datediff(log_in, date_opened) as date_diff from table1 where log_in < date_opened ) as temp_table where date_diff > 0;
CTE写法(适用于支持CTE的数据库,如MySQL 8+、PostgreSQL、SQL Server等)
with temp_cte as ( select first_name, log_in, date_opened, datediff(log_in, date_opened) as date_diff from table1 where log_in < date_opened ) select * from temp_cte where date_diff > 0;
另外你提到用HAVING无效,是因为HAVING主要用于筛选分组聚合后的结果,没有GROUP BY的场景下单独使用HAVING不符合SQL逻辑,因此不适用你的需求。
内容的提问来源于stack exchange,提问作者sean
相关产品推荐
相关产品推荐

