我的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);
但是似乎没有任何效果。我想念什么吗?有人可以帮忙吗?
答案 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 )
您正在使用当前的sysdate
将NLS_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);