按时间戳排序数据库记录 - Oracle

时间:2012-02-15 21:48:31

标签: sql oracle

对于查询:

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 个答案:

答案 0 :(得分:4)

结果的排序没有改变;如果你看一下你的结果,你会注意到日期/秒组合没有变化。这主要是因为在ORDER BY语句中,您按LOG_CREATION_DATE本身排序,而不是修改后的表示。

您看到的错误是因为您告诉格式化字符串您想要 MONTH 两次 - 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 

答案 1 :(得分:2)

您的日期格式掩码错误,如果您应该HH:MM:SS,则时间部分为HH:MI:SS。或者更好,HH24:MI:SS

答案 2 :(得分: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