MS Access复杂日期排序求助:按9am至次日8am排序Hour列
解决Hour列按9am到次日8am排序的问题
嘿,我懂你现在的烦恼——本来想让Hour列按9点到次日8点的顺序排列,结果用UNION拆分两个查询加排名的方式,最后得到的还是9-23时段在前、0-8时段在后,完全不符合预期对吧?别慌,咱们来拆解问题,找到更简洁靠谱的解决办法。
问题根源
你之前用两个带ORDER BY的查询做UNION,其实这里有个坑:UNION会把两个子查询的结果合并后,默认按结果集的第一列重新排序,子查询里的ORDER BY根本不会生效(除非你在子查询里用TOP/LIMIT限制行数,但这显然不是你要的效果)。所以这种拆分方式本身就没法保证整体的排序逻辑。
最优解决方案:用CASE语句定义排序权重
其实不用拆分查询,咱们只需要给不同时段的Hour分配一个自定义排序值,让9-23点的排序值从小到大排在前面,0-8点的排序值接在后面就行。具体来说:
- 对于9点及以后的小时(9-23),排序值设为
Hour - 9,这样9点对应0,10点对应1,…,23点对应14 - 对于0-8点的小时,排序值设为
Hour + 15,这样0点对应15,1点对应16,…,8点对应23
这样排序的时候,按这个自定义值升序排列,就正好是9am→10am→…→23pm→0am→…→8am的顺序。
举个具体的SQL例子(假设你的表是your_table,Hour是0-23的整数类型,还有日期范围参数):
SELECT Hour, -- 这里放你需要的其他列 other_columns FROM your_table WHERE date_column BETWEEN @start_date AND @end_date ORDER BY CASE WHEN Hour >= 9 THEN Hour - 9 ELSE Hour + 15 END ASC;
如果你的Hour是TIME类型(比如09:00:00这种),只需要先提取小时数再用同样的逻辑:
SELECT Hour, other_columns FROM your_table WHERE date_column BETWEEN @start_date AND @end_date ORDER BY CASE WHEN DATEPART(HOUR, Hour) >= 9 THEN DATEPART(HOUR, Hour) - 9 ELSE DATEPART(HOUR, Hour) + 15 END ASC;
如果需要添加排名
要是你还需要按这个顺序生成排名,直接把CASE逻辑放进窗口函数里就行:
SELECT Hour, other_columns, ROW_NUMBER() OVER ( ORDER BY CASE WHEN Hour >= 9 THEN Hour - 9 ELSE Hour + 15 END ASC ) AS rank_num FROM your_table WHERE date_column BETWEEN @start_date AND @end_date ORDER BY rank_num;
这个方法比拆分UNION要高效得多,逻辑也更清晰,完全能满足你要的排序需求~
内容的提问来源于stack exchange,提问作者JL Tan
相关产品推荐
相关产品推荐

