Упорядочение записей базы данных по отметке времени - Oracle - PullRequest
1 голос
/ 16 февраля 2012

Для запроса:

SELECT MAX(LOG_CREATION_DATE),COL_A, COL_B
FROM IMPORT_LOG
GROUP BY TO_CHAR(LOG_CREATION_DATE, 'MM-DD-YYYY'),
              COL_A,
              COL_B
ORDER BY  MAX(LOG_CREATION_DATE)  DESC
              ;

записи в порядке убывания по мере необходимости:

09-FEB-12 12.59.18.000000000 PM
09-FEB-12 12.41.42.000000000 PM
09-FEB-12 11.26.15.000000000 AM
09-FEB-12 11.26.00.000000000 AM
01-FEB-12 01.27.11.000000000 PM
01-FEB-12 01.25.18.000000000 PM
01-FEB-12 01.25.17.000000000 PM
01-FEB-12 01.24.36.000000000 PM
25-JAN-12 02.39.11.000000000 PM
25-JAN-12 02.32.05.000000000 PM
25-JAN-12 02.31.37.000000000 PM
25-JAN-12 02.31.34.000000000 PM

Но когда я изменяю запрос на форматирование того же столбца отметки времени, порядок полностью меняется на:

02-09-2012 12:02:18
02-09-2012 12:02:42
02-09-2012 11:02:15
02-09-2012 11:02:00
02-01-2012 01:02:11
02-01-2012 01:02:18
02-01-2012 01:02:17
02-01-2012 01:02:36
01-25-2012 02:01:11
01-25-2012 02:01:05
01-25-2012 02:01:37
01-25-2012 02:01:34

обновленный запрос

SELECT TO_CHAR(MAX(LOG_CREATION_DATE), 'MM-DD-YYYY HH:MM:SS'),COL_A, COL_B
FROM IMPORT_LOG
GROUP BY TO_CHAR(LOG_CREATION_DATE, 'MM-DD-YYYY'),
              COL_A,
              COL_B
ORDER BY  MAX(LOG_CREATION_DATE)  DESC
              ;

почему выход изменился?

Ответы [ 3 ]

4 голосов
/ 16 февраля 2012

Порядок ваших результатов не изменился; если вы посмотрите на свои результаты поближе, вы заметите, что комбинация дата / секунда не изменилась. Это в основном потому, что в вашем операторе ORDER BY вы упорядочиваете по LOG_CREATION_DATE, а не в измененном представлении.

Ошибка, которую вы видите, заключается в том, что вы указываете нужную строку форматирования МЕСЯЦ дважды - MM равно месяцу и равно не зависит от контекста (используйте MI в течение нескольких минут - извините, я не пользуюсь Oracle, поэтому мне понадобилась секунда, чтобы это уловить).

Вот исправленное утверждение - это генерирует то, что вы хотели? Кроме того, я не рекомендую группировать по представлению символов - вместо этого используйте TRUNC().

SELECT TO_CHAR(MAX(log_creation_date), 'MM-DD-YYYY HH:MI:SS'), COL_A, COL_B 
FROM Import_Log 
GROUP BY TRUNC(log_creation_date), COL_A, COL_B 
ORDER BY  MAX(log_creation_date) DESC 
2 голосов
/ 16 февраля 2012

Ваша маска формата даты неверна, у вас есть часть времени как HH:MM:SS, когда у вас должно быть HH:MI:SS.Или еще лучше, возможно, HH24:MI:SS.

1 голос
/ 16 февраля 2012

Вы упорядочиваете строковое представление даты в 12-часовом календаре.Ваш TO_CHAR также неправильно использует MM дважды.

Попробуйте вместо этого:

SELECT         TO_CHAR(MAX (LOG_CREATION_DATE) , 'MM-DD-YYYY HH:MI:SS') AS CUSTOM_LOG_CREATION_DATE,
               USER,
               LOCATION,
               SUM(FILE_NAME) AS SUM_IMPORT
FROM           MYTABLE
GROUP BY      TO_CHAR(LOG_CREATION_DATE, 'MM-DD-YYYY'),
              USER,
              LOCATION
ORDER BY MAX (LOG_CREATION_DATE) DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...