【问题标题】:Sorting a column in Oracle based on time根据时间对Oracle中的列进行排序
【发布时间】:2012-02-20 07:57:22
【问题描述】:

我正在 Oracle 中尝试另一种排序方式。就像我有三列,即日期、开始时间和结束时间,我需要按以下方式对列进行排序。

如果当前时间在开始时间和结束时间之间,则该行应位于顶部。否则应按正常升序排序。

现在我的查询看起来像这样

select * from details order by date,start_time

排序时如何考虑当前时间?

【问题讨论】:

    标签: java oracle datetime sorting sql-order-by


    【解决方案1】:

    我想到的第一个想法:

    SELECT *
    FROM   details
    ORDER  BY ( CASE WHEN date_column BETWEEN start_time AND end_time THEN 0 ELSE 1 END )
            , date_column
            , start_time;
    

    【讨论】:

    • 天哪,我打字不够快。当前时间问题是指真正的SYSDATE 还是CURRENT_DATE?我的解释是,它是第一句话中提到的三列之一。
    【解决方案2】:

    如果“当前时间”表示“sysdate”,并假设“按正常升序排序”表示“按 start_time 升序排序”,您可以执行类似的操作

    SELECT *
      FROM details
     ORDER BY (CASE WHEN sysdate BETWEEN start_time AND end_time 
                    THEN 1
                    ELSE 0
                END) desc,
              start_time asc
    

    如果你的意思是别的,一些样本数据和预期的输出肯定会有所帮助。

    【讨论】:

      【解决方案3】:

      您可能需要在 Oracle 中调整语法,但该概念应该适用。

      SELECT d.*,
             CASE WHEN sysdate BETWEEN Start_Time AND End_Time THEN 0 ELSE 1 END SortKey
        FROM Details
       ORDER BY SortKey, Date, Start_Time;
      

      基本上,这会创建一个列,根据您的需要对结果进行人为分组。这可能是一项有价值的技术。我喜欢查看排序标准——至少在调试时——所以我把它放在了 SELECT 列表中。如果您愿意,也可以将其隐藏在 ORDER BY 子句中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-06
        • 2020-05-29
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 2021-04-21
        相关资源
        最近更新 更多