日期格式化SQL的问题

时间:2012-10-19 08:49:03

标签: sql oracle date formatting

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';

3 个答案:

答案 0 :(得分:2)

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

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

TRUNC(SYSDATE)今天早上给你午夜,所以如果今天运行它会在18-Oct-2010 00:00:0018-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')

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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