2012-02-15 101 views
1

對於查詢:按降序根據需要訂購數據庫記錄 - 甲骨文

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 
       ; 

爲什麼輸出改變了?

+0

看起來它仍然按降序時間戳排序,而不是由字符表示形式(假設所有'02'分鐘都是錯字)。爲什麼你要在MDY上訂購你的結果? – 2012-02-15 23:16:49

+0

'LOG_CREATION_DATE'是一個時間戳字段,排序不是由MDY完成的。 「所有'02分鐘'是什麼意思是一個錯字」? – 2012-02-15 23:19:41

+0

沒有什麼是結果中的拼寫錯誤,而這正是我發佈它的原因。爲什麼TO_CHAR()會改變時間戳和排序? – 2012-02-15 23:25:14

回答

2

您的日期格式掩碼是錯誤的,你有時間一部分HH:MM:SS時,你應該有HH:MI:SS。或者甚至更好,HH24:MI:SS

1

您正在以12H日曆中的日期的字符串表示形式進行排序。您的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 
+0

它仍然不正確。我已經更新了我的帖子,並且在進行更改後得到的訂單 – 2012-02-15 22:32:04

+0

@ darkie15我修改了我的答案,以考慮其他答覆者注意到的格式字符串錯誤。 – 2012-02-16 03:20:48

4

您的結果排序沒有改變;如果您的結果看起來更接近一點,那麼您會注意到日期/秒組合未更改。這主要是因爲在您的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