我希望我的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列 - 我估计如此,但我没有权限查看表结构,所以......?
答案 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)
也许你想做别的事。