如何在to_char列上执行排序

时间:2010-03-04 15:50:49

标签: sql oracle sql-order-by

我有以下oracle查询:

   SELECT a.USER_ID,
           c.first_name,
           c.last_name,
           TO_CHAR( b.logon_date, 'MM/DD/YYYY HH:MI:SS am') logon_date,
           NVL(TO_CHAR( b.logoff_date, 'MM/DD/YYYY HH:MI:SS am'), '') logoff_date,
           a.session_id
      FROM table a,
           table b,
           table c
       WHERE a.row_id >= start_row
               AND a.row_id <= end_row
               AND a.session_id = b.session_id
               AND a.USER_ID = b.USER_ID
               AND a.USER_ID = RTRIM(LTRIM(c.USER_ID))
      ORDER BY logoff_date DESC
如果删除order by

查询工作正常

我希望order基于我使用DESC logoff_date to_char的{​​{1}}订单查询此查询的结果,以使其成为日期/时间分

我尝试将以下内容设为order_by

NVL(TO_CHAR( b.logoff_date, 'MM/DD/YYYY HH:MI:SS am'), '')

但结果又回来了:

03/03/2010 12:59:37 am
03/03/2010 12:53:12 pm
03/03/2010 12:41:40 pm
03/03/2010 12:19:38 am
03/03/2010 11:34:04 am
03/03/2010 10:41:47 am
03/03/2010 10:16:16 pm
03/03/2010 10:14:45 pm
03/03/2010 09:59:54 am
03/03/2010 07:36:17 pm

1 个答案:

答案 0 :(得分:5)

目前,您按日期的字符值排序,因为logoff_date引用了select(logoff_date)中的别名NVL(TO_CHAR( ...))。此字符值通常按字母顺序排序,与DATE列的顺序不匹配。

如果您想按列的DATE值排序,则必须精确引用它:

ORDER BY b.logoff_date
         ^^