首页 > 解决方案 > 根据(小于)CURRENT_DATE 过滤 oracle DB 中的记录似乎不起作用?

问题描述

有一个奇怪的问题,即使用CURRENT_DATE(在特定时间)过滤 Oracle DB 中的记录似乎不起作用。

我有一个使用 sqoop 运行查询的日常 ETL 过程......

select a.* from SOURCE_DATA a where 
         POST_DATE > to_date('2020-04-10', 'yyyy-mm-dd') 
         AND POST_DATE < TRUNC(CURRENT_DATE) 
         AND \\$CONDITIONS

post_date(较低的日期是根据我们本地数据 MSSQL 仓库中记录的最高值每天获取的)。我试图从 oracle DB 中的 SOURCE_DATA 表中获取除此之外的所有内容(但少于当天的数据)。

这在 2020 年 4 月 12 日运行。然而,我看到一些post_date= 4/12/2020 的记录(而我希望最多只有post_date= 4/11/2020 的记录)。因此,日期过滤器似乎不起作用。

这发生在之前将具有post_date>=<current date>的数据增量添加到源表(通常只有来自<current date>- 1 的数据)


这个 sqoop 进程通过运行airflow,那些 sqoop 日志显示...

[2020-04-12 21:32:54,161] {bash_operator.py:128} INFO - 20/04/12 21:32:54 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(TDL_ID), MAX(TDL_ID) FROM (select a.* from SOURCE_DATA a where POST_DATE > to_date('2020-04-10', 'yyyy-mm-dd')                 AND POST_DATE < TRUNC(CURRENT_DATE) AND  (1 = 1) ) t1
.
.
.
[2020-04-12 21:38:23,086] {bash_operator.py:128} INFO - 20/04/12 21:38:23 INFO mapreduce.ImportJobBase: Transferred 1.1264 MB in 331.2884 seconds (3.4816 KB/sec)

因此,我们看到查询在 2020 年 4 月 13 日上午 12 点(2020 年 4 月 12 日下午 9:32 - 2020 年 4 月 12 日下午 9:38)之前运行良好,post_date从查询中查看 = 4/12/2020 的记录是有意义的.

检查 oracle DB 上的时区,

SELECT SESSIONTIMEZONE, SYSDATE, CURRENT_DATE, TRUNC(CURRENT_DATE), TRUNC(CURRENT_DATE - 1) FROM DUAL;

我们看

SESSIONTIMEZONE SYSDATE                CURRENT_DATE            TRUNC(CURRENT_DATE)     TRUNC(CURRENT_DATE-1)
-10:00          4/13/2020 12:04:28 PM  4/13/2020 12:04:28 PM   4/13/2020 12:00:00 AM   4/12/2020 12:00:00 AM

所以昨天的日期看起来很好,时区偏移对于 HST 时间(我所在的时间)是正确的。

无法验证post_date字段的数据类型(该表实际上是一个视图,我对其构造一无所知),但日期过滤器的下限似乎工作正常,所以我假设它是某种日期类型。

不确定是什么导致了这个错误(不确定是 oracle 还是 sqoop 或其他东西(因此有多个标签))。任何有更多经验的人都知道这里会发生什么?进一步的调试建议?

标签: oraclesqoop

解决方案


推荐阅读