2010-03-04 9 views
0

J'ai une requête oracle suivant:comment faire pour par une colonne to_char

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 

requête fonctionne bien si je retire la order by

Je veux order les résultats de cette requête dans DESC ordre basé sur logoff_date sur lequel je me sers to_char pour en faire une date avec le temps am/pm

Je donne suite comme essayé order_by

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

mais les résultats reviennent comme:

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

Qu'advient-il si vous exécutez le SQL comme indiqué. Vous indiquez que la requête fonctionne correctement si vous supprimez la commande, ce qui signifie qu'elle ne fonctionne pas correctement lorsque vous l'avez. – Craig

+0

ça fonctionne bien = si je ne veux pas trier il ne fonctionne pas bien = si je veux trier – drake

Répondre

5

Actuellement, vous commandez par la valeur de caractère de votre date parce logoff_date fait référence à l'alias logoff_date dans la sélection (NVL(TO_CHAR(...))). Cette valeur de caractère sera généralement triée par ordre alphabétique et ne correspondra pas à la commande de la colonne DATE.

Si vous souhaitez commander par la valeur DATE de la colonne, vous devrez référencer précisément:

ORDER BY b.logoff_date 
     ^^ 
Questions connexes