为什么被命令被忽视?

时间:2012-05-21 19:30:07

标签: sql oracle sql-order-by dotconnect

我希望我的SQL返回给定日期的所有记录,最新的记录在顶部(我订购的列包含日期和时间 - 包含诸如“5/21/2012 11:48”之类的条目:04:00“)。

我认为我的sql(下面)会这样做。但是,实际结果忽略了时间因素。它们会像这样返回:

5/21/2012 10:48:04 AM
5/21/2012 10:12:04 AM
5/21/2012 9:48:04 AM
5/21/2012 10:54:04 AM
5/21/2012 11:48:04 AM
...

(IOW,返回的结果只是随机排序,就时间元素而言)

查询是:

SELECT ENTRYDATE ENTERED, ENTEREDBYABC ABC
FROM 
   SomeTable v 
   LEFT JOIN SomeTable w ON v.someCol = w.someCorrespondingCol
WHERE
   ABC = :abc AND ENTRYDATE = trunc(sysdate) 
ORDER BY ENTERED DESC

更新

更具体的查询和结果:

这(列名和表名已更改):

SELECT ENTRYDATE ENTERED, ENTEREDBYABCID ABCID, COMMENTS
FROM 
  WHITMAN.HOLLOWSKY@ATTORNEY v 
  LEFT JOIN ABCworker w ON v.enteredbyabcid = w.abcid
WHERE
  ABCID = 124393 AND ENTRYDATE = TRUNC(sysdate) 
ORDER BY ENTRYDATE desc

...返回记录:

ENTERED     ABCID   COMMENTS
5/21/2012   1234    At 1:36 PM, ...
5/21/2012   1234    At 1:36 PM, ...
5/21/2012   1234    At 9:23 AM, ...
5/21/2012   1234    At 11:07 AM, ...
5/21/2012   1234    At 11:12 AM, ...
5/21/2012   1234    At 1:42 PM, ...
5/21/2012   1234    At 11:02 AM, ...
5/21/2012   1234    At 9:19 AM, ...
. . .

再次更新

使用查询:

select entrydate from WHITMAN.HOLLOWSKY@ATTORNEY order by entrydate desc

我明白了:

5/21/2012 3:15:50 PM
5/21/2012 3:15:35 PM
5/21/2012 3:15:25 PM
5/21/2012 3:15:25 PM
5/21/2012 3:14:31 PM
5/21/2012 3:14:22 PM
5/21/2012 3:14:11 PM
. . .

IOW,它运作得很好。

“entrydate”是否是DateTime列 - 我估计如此,但我没有权限查看表结构,所以......?

2 个答案:

答案 0 :(得分:3)

我怀疑问题是你有一个名为" ENTERED"在你要加入的其中一个表格中。

因此,您按该列进行排序,即使它不在SELECT列表中。要解决此问题,您应该执行以下操作之一:

ORDER BY 1

ORDER BY ENTRYDATE

(格伦的评论中已经提到了第二个。)

答案 1 :(得分:2)

您的ORDER BY正在受到尊重。问题是您选择的所有11行的时间组件必须是午夜才能满足谓词

entrydate = TRUNC(sysdate) 

查询

SELECT ENTRYDATE ENTERED, ENTEREDBYABCID ABCID, COMMENTS
  FROM WHITMAN.HOLLOWSKY@ATTORNEY v 
       LEFT JOIN ABCworker w ON v.enteredbyabcid = w.abcid
 WHERE ABCID = 124393 
   AND ENTRYDATE = TRUNC(sysdate) 
 ORDER BY ENTRYDATE desc

请求entrydate今天午夜的所有行,然后在entrydate上排序。根据定义,由于entrydate只有一个可能的值满足谓词,因此ORDER BY无关紧要。所有11行对entrydate具有完全相同的值,因此对该值进行排序会产生任意排序的结果。 Oracle可以非常正确地以任何顺序返回11行,并且仍然遵守您的ORDER BY条款。

也许您希望按照存储在comments列而不是entrydate中的时间进行排序。也许您想要更改谓词以返回entrydate今天某个时间的所有行。

AND trunc(entrydate) = trunc(sysdate)

也许你想做别的事。