使用SYSDATE-前一天的记录没有记录被提取-ORACLE

时间:2019-02-25 15:51:38

标签: oracle

我的stat()数据类型表中有 INSERT_TIME UPDATE_TIME 列。这两个列现在都具有值 24-FEB-2019 (用于10条记录)。

我现在使用以下查询来选择以下10条记录:

Date

此查询未选择记录,并且返回空结果。

我还修改了查询,例如:

SELECT /*+parallel(8)*/ * 
FROM   SCHEMA.table1 
WHERE  (insert_time = Trunc(To_date(sysdate)) - 1 ) 
        OR (update_time = Trunc(To_date(sysdate)) - 1 ) 
           AND table1_zipcode NOT IN(SELECT zipcode 
                                     FROM   SCHEMA.table2);

SELECT /*+parallel(8)*/ * 
FROM   SCHEMA.table 
WHERE  ( insert_time = Trunc(sysdate) - 1 ) 
        OR ( update_time = Trunc(sysdate) - 1 ) 
           AND table1_zipcode NOT IN(SELECT zipcode 
                                     FROM   SCHEMA.table2); 

但是似乎没有任何效果。我想念什么吗?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

Oracle日期值(包括sysdate)包括时间。有时这是所有行的午夜,这时该列仅用于捕获日期部分。在您的情况下似乎并非如此,并且您将全天都有时间。 (这是由列名建议的,但实际上,您目前没有任何匹配项,因此更是如此。)

如果您的客户向您显示的值是24-FEB-2019,那么您将无法确定它们的时间段;您可以使用to_char(insert_time, 'YYYY-MM-DD HH24:MI:SS')更改客户端或NLS设置,或在查询中指定完整的日期/时间格式模型。

当您这样做:

(insert_time = Trunc(To_date(sysdate)) - 1 ) 

您正在使用当前的sysdateNLS_DATE_FORMAT从日期隐式转换为字符串,然后使用相同的格式模型将其隐式转换回日期。考虑到您对24-FEB-2019的引用,该模型为DD-MON-YYYY,这意味着您实际上已经失去了转换中的时间部分-to_date()将为您提供开始时间为午夜。 (但是,使用其他NLS设置运行的其他人可能看不到有什么效果。)然后trunc()将时间设置为午夜,这实际上对您的NLS设置没有任何作用。然后减去一天。

当您这样做:

( insert_time = Trunc(sysdate) - 1 )

您正在跳过与字符串之间的转换,而这次trunc()确实将时间部分设置为午夜。

在两种情况下,您都需要查找恰好是午夜的记录-即insert_time恰好是2019-02-24 00:00:00。由于您没有找到任何行,因此该日期的表数据都没有恰好在午夜,这可能不足为奇。

当您这样做:

( insert_time = sysdate - 1 ) 

您不再将时间部分设置为午夜了,但这意味着,如果您今天在15:51:37运行此时间,那么您将只匹配inert_time恰好是2019-02-24的行15:15:37,这是可能的,但如果当天只有10行,则不可能。每次执行都检查不同的时间,因此最终可能会很幸运...

如果您想在昨天的任何时候查找行,可以执行以下操作:

(insert_time >= trunc(sysdate) - 1 and insert_time < trunc(sysdate))

它将在昨天午夜(系统日期-1)或之后查找任何内容,但今天早于午夜。与update_time相同,带有适当的括号以控制逻辑评估。

SELECT /*+parallel(8)*/ * 
FROM   SCHEMA.table1 
WHERE  (
            (insert_time >= trunc(sysdate) - 1 AND insert_time < trunc(sysdate)) 
         OR (update_time >= trunc(sysdate) - 1 AND update_time < trunc(sysdate))
       )
AND table1_zipcode NOT IN(SELECT zipcode FROM SCHEMA.table2);