SQL多datetime列排序问题:如何按任一最新日期优先排序?
解决方法
你原SQL的排序逻辑有问题:它会优先按r_closed列降序排列,只有当两行的r_closed日期完全相同时,才会对比sfh_regeneratedon列。这就导致如果某行的sfh_regeneratedon是最新的,但r_closed日期较旧,它会被排在后面,不符合你“只要其中一列日期最新就排顶部”的需求。
你需要以两列中的最大日期值作为排序依据,不同数据库的实现方式略有差异:
1. 支持GREATEST函数的数据库(MySQL、Oracle、PostgreSQL等)
直接取两列的最大值进行降序排序:
select * from v_ServiceHistory where r_customer = 80 order by GREATEST(r_closed, sfh_regeneratedon) desc;
2. SQL Server(无GREATEST函数,用IIF或CASE)
用IIF函数判断哪个日期更大:
select * from v_ServiceHistory where r_customer = 80 order by IIF(r_closed > sfh_regeneratedon, r_closed, sfh_regeneratedon) desc;
或者用兼容性更强的CASE语句:
select * from v_ServiceHistory where r_customer = 80 order by CASE WHEN r_closed > sfh_regeneratedon THEN r_closed ELSE sfh_regeneratedon END desc;
额外说明
如果某列存在NULL值,需要用COALESCE将NULL替换为一个极小值(比如'1900-01-01'),避免NULL影响最大值计算。以MySQL为例:
select * from v_ServiceHistory where r_customer = 80 order by GREATEST(COALESCE(r_closed, '1900-01-01'), COALESCE(sfh_regeneratedon, '1900-01-01')) desc;
内容的提问来源于stack exchange,提问作者kunal verma
相关产品推荐
相关产品推荐

