2012-02-15 100 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