如何在to_char列上执行排序

dra*_*ake 0 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
Run Code Online (Sandbox Code Playgroud)

查询工作正常,如果我删除 order by

我希望order这个查询的结果按DESC顺序基于logoff_date我使用to_char它来使它成为一个时间在上午/下午的日期

我尝试给予以下作为 order_by

NVL(TO_CHAR( b.logoff_date, 'MM/DD/YYYY HH:MI:SS am'), '')
Run Code Online (Sandbox Code Playgroud)

但结果又回来了:

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
Run Code Online (Sandbox Code Playgroud)

Vin*_*rat 5

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

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

ORDER BY b.logoff_date
         ^^
Run Code Online (Sandbox Code Playgroud)