You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:39:48