如何比较格式化字段并将其用于WHERE子句条件筛选?
解决TblUser表筛选转换后日期无重复记录的问题
原SQL的问题
- 语法错误:语句结构混乱,
FROM TblUser位置错误,且select *与format(...)之间缺少逗号,正确的SQL结构应为SELECT 列 FROM 表 WHERE 条件。 - 逻辑错误:
WHERE DT != DT是同一行内的字段自比较,同一行的计算结果必然相等,这个条件永远为假,无法筛选出任何数据。
可行的实现方法
方法一:使用窗口函数(推荐,适用于支持窗口函数的数据库如SQL Server、PostgreSQL、MySQL 8.0+)
通过窗口函数按转换后的日期分组,计算每组的记录数,再筛选出记录数为1的条目:
SELECT [User], FORMAT(DateTime, 'ddMMyyyy') AS DateTime FROM ( SELECT [User], DateTime, -- 按转换后的日期分组,统计每组的记录数 COUNT(*) OVER (PARTITION BY FORMAT(DateTime, 'ddMMyyyy')) AS dt_count FROM TblUser ) AS sub_query -- 只保留记录数为1的分组对应的记录 WHERE dt_count = 1;
方法二:使用GROUP BY + 关联查询(兼容旧版数据库)
先通过分组找出唯一的转换后日期,再关联原表获取对应记录:
SELECT u.[User], FORMAT(u.DateTime, 'ddMMyyyy') AS DateTime FROM TblUser u INNER JOIN ( -- 筛选出仅出现一次的转换后日期 SELECT FORMAT(DateTime, 'ddMMyyyy') AS unique_dt FROM TblUser GROUP BY FORMAT(DateTime, 'ddMMyyyy') HAVING COUNT(*) = 1 ) AS unique_dates ON FORMAT(u.DateTime, 'ddMMyyyy') = unique_dates.unique_dt;
注意事项
若你的数据库不支持FORMAT函数(如MySQL),可以用对应数据库的日期格式化函数替代:
- MySQL:
DATE_FORMAT(DateTime, '%d%m%Y') - PostgreSQL:
TO_CHAR(DateTime, 'DDMMYYYY')
内容的提问来源于stack exchange,提问作者korugane
相关产品推荐
相关产品推荐

