0

我希望我的 SQL 返回给定日期的所有记录,最近的记录在顶部(我排序的列包含日期和时间 - 包含诸如“5/21/2012 11:48:04 AM ”)。

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

2012 年 5 月 21 日上午 10:48:04
2012 年 5 月 21 日上午 10:12:04
2012 年 5 月 21 日上午 9:48:04
2012 年 5 月 21 日上午 10:54:04
2012 年 5 月 21 日上午 11:48:04
...

(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 列 - 我认为是这样,但我没有权限查看表结构,所以......?

4

2 回答 2

3

我怀疑问题在于您要加入的其中一个表中有一个名为“ENTERED”的列。

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

ORDER BY 1

或者

ORDER BY ENTRYDATE

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

于 2012-05-21T19:41:00.910 回答
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)

也许你想做点别的。

于 2012-05-21T23:20:00.960 回答