0
SELECT LISTING_EOD.LOCATION, LISTING_EOD.APPTTIME, LISTING_EOD.PERSON_ID,
    LISTING_EOD.FORENAME, LISTING_EOD.SURNAME, LISTING_EODS.STATUS,
    LISTING_EOD.DBDATE
FROM DBNAME.LISTING_EOD LISTING_EOD; 

此查询返回今天处理的数据列表,我需要修改以查看昨天的数据。我尝试添加以下代码行,但它没有返回任何内容。有谁知道我怎么能做到这一点?

where LISTING_EOD.DBDATE = '18-OCT-2012';
4

3 回答 3

2

如果您总是想要昨天的数据,而不是硬编码可以使用的日期:

WHERE LISTING_EOD.DBDATE >= TRUNC(SYSDATE) - 1
AND LISTING_EOD.DBDATE < TRUNC(SYSDATE)

TRUNC(SYSDATE)今天早上给你午夜,所以如果今天运行它会给出 和 之间的18-Oct-2010 00:00:00范围18-Oct-2012 23:59:59

使用隐式日期格式掩码通常不是一个好主意;您的原始代码假定您NLS_DATE_FORMAT的设置为DD-MON-YYYY,但现在可能不正确(如果您在现有选择中看到时间,那么它可能不是),并且将来可能不会。始终使用明确的日期格式掩码,例如TO_DATE('18-OCT-2012', 'DD-MON-YYY'),以避免歧义和意外行为。


如果该字段实际上是VARCHAR2而不是DATE- 这很糟糕 - 那么您需要将日期范围转换为字符串以获得匹配:

WHERE LISTING_EOD.DBDATE >= TO_CHAR(TRUNC(SYSDATE) - INTERVAL '1' DAY, 'DD-MON-YYYY HH24:MI:SS')
AND LISTING_EOD.DBDATE <= TO_CHAR(TRUNC(SYSDATE) - INTERVAL '1' SECOND, 'DD-MON-YYYY HH24:MI:SS')

这将只工作一天,但您在寻找日期范围时会遇到问题。将数据存储在适当类型的列中会更好、更安全。

于 2012-10-19T09:05:12.243 回答
0

默认情况下,Oracle 中的日期也包含时间。如果您只指定 '18-OCT-2012',它将仅匹配 18-OCT-2012 00:00:00'。解决此问题的一种方法是将数据库日期格式化为您要与之比较的日期,例如 to_char(LISTING_EOD.DBDATE, 'DD-MON-YYYY') 并将其与 '18-OCT-2012' 进行比较。这种比较将完全忽略时间。

如果您有要比较的日期变量而不是字符串,请使用与数据库日期相同的日期掩码对其进行格式化。这也绕过了有关数据库的默认日期格式的任何假设。

于 2012-10-19T09:35:03.740 回答
0

我意识到我正在查询的“表”是一个视图,在 sqldeveloper 中对其进行了检查,并在 sysdate 中添加了“-1”。然后,此查询返回前几天的结果。

我成功检索到正确的数据,感谢收到的所有帮助。

于 2012-10-19T09:39:26.627 回答