Oracle SQL loader-在同一列中加载不一致的日期格式

Oracle SQL loader-在同一列中加载不一致的日期格式,oracle,date,format,sql-loader,Oracle,Date,Format,Sql Loader,一个客户端站点提供了以下提取文件,供我们加载到数据库中 问题是,对于某些行(例如第二行),创建日期和上次更新日期是“dd-Mmm-YYYY…”日期格式,而其余行(如顶部)是“yyy-MM-dd HH24.MI.SSXFF”格式 我的问题是: 问题1。为了避免必须请求提取,我们可以使用.ctl脚本在SQL Loader的导入时操纵这些“dd-Mmm-YYYY…”格式的日期吗?目前我的.ctl是 My.ctl文件已编写脚本,以便使用以下方法导入: IDENTIFIER_START_DATE TI

一个客户端站点提供了以下提取文件,供我们加载到数据库中

问题是,对于某些行(例如第二行),创建日期和上次更新日期是“dd-Mmm-YYYY…”日期格式,而其余行(如顶部)是“yyy-MM-dd HH24.MI.SSXFF”格式

我的问题是: 问题1。为了避免必须请求提取,我们可以使用.ctl脚本在SQL Loader的导入时操纵这些“dd-Mmm-YYYY…”格式的日期吗?目前我的.ctl是

My.ctl文件已编写脚本,以便使用以下方法导入:

IDENTIFIER_START_DATE   TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF",
LAST_UPDATE_DATE        TIMESTAMP "YYYY-MM-DD HH24.MI.SSXFF"

问题2。在这种情况下,简单地要求他们按照要求重新提取所有日期格式是最佳做法吗

是否请求重新提取数据取决于许多因素

  • 这是一个一次性过程还是一个持续的数据馈送?尽最大努力处理一次性加载的数据可能是完全合理的,因为这样更容易发现异常值。如果您要管理一个正在进行的数据提要,通常来说,就文件的严格标准达成一致比试图手动检查有问题的行更有意义
  • 客户是否有动机使您的加载过程简单且可重复?或者客户是以固定价格出售的,以便以他们希望提供的任何格式加载数据?如果客户有动机使加载过程简单且可重复,那么他们就应该花时间生成一个干净的文件。另一方面,如果您以固定价格向他们出售将文件转换为连贯数据所需的任何工作,那么如果您将大量工作推给他们,他们可能不会满意
  • 是否有数据不明确的行?例如,“01-02-03”可以指2003年1月2日或1903年1月2日或2001年2月3日或其他一些日期。如果存在歧义,请求重新提取是有意义的
至于如何加载数据,虽然可以在一个步骤中完成,但您通常不想这样做。通常,将数据加载到一个暂存表(或使用一个外部表)中会更有意义,其中所有列都声明为
VARCHAR2
,然后编写一些ETL逻辑,将数据转换为适当的数据类型(并记录无法转换的数据的错误)。例如,如果将数据加载到一个staging表中,其中所有列都定义为
VARCHAR2
,则可以使用类似的方法尝试多种不同的格式掩码,以找到一种有效的格式掩码(如果有很多可能的掩码,您可能希望迭代一个集合,而不是像我在那个示例中那样对两个掩码进行硬编码)


还有一点…Oracle
DATE
将时间存储到秒,这似乎是给定数据的精度。因此,将数据加载到
DATE
列而不是
TIMESTAMP
列似乎更有意义。

是否请求重新提取数据取决于关于一些因素

  • 这是一个一次性的过程还是一个持续的数据馈送?尽最大努力处理一次性加载的数据可能是完全合理的,因为这样可以更容易地发现异常值。如果您要管理一个持续的数据馈送,通常来说,就文件的严格标准达成一致,而不是试图手动检查异常值更为合理t有问题的行
  • 客户是否有动机使您的加载过程简单且可重复?或者客户是否以固定价格出售,以便以他们希望提供的任何格式加载数据?如果客户有动机使加载过程简单且可重复,则他们有理由投入时间生成干净的文件。如果您以固定的价格卖给他们需要做的任何工作,以将文件转换为一致的数据,另一方面,如果你把大量的工作推给他们,他们可能不会高兴
  • 是否存在数据不明确的行?例如,“01-02-03”可能指2003年1月2日、1903年1月2日或2001年2月3日或其他一些日期。如果存在不明确的行,则请求重新提取是有意义的
至于如何加载数据,虽然可以在一个步骤中完成,但您通常不想这样做。将数据加载到临时表(或使用外部表)通常更有意义其中所有列都声明为
VARCHAR2
,然后编写一些ETL逻辑,将数据转换为适当的数据类型(并记录无法转换的数据的错误)。例如,如果将数据加载到一个暂存表中,其中所有列都定义为
VARCHAR2
,则可以使用类似的方法尝试多种不同的格式掩码,以找到一种有效的格式掩码(如果有很多可能的掩码,您可能希望迭代一个集合,而不是像我在那个示例中那样对两个掩码进行硬编码)


还有一点…Oracle
DATE
将时间存储到秒,这似乎是给定数据的精度。因此,将数据加载到
DATE
列而不是
TIMESTAMP
列似乎更有意义。

使用此.ctl脚本:

load data
append
into table schema_name.table_name
fields terminated by ';' optionally enclosed by '"'
(
PRIMARY_ID,
ID_VALUE,
CREATED_DATE "to_date(:CREATED_DATE, case when regexp_substr(:CREATED_DATE,'\w+',1,2)=regexp_substr(:CREATED_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)",
LAST_UPDATE_DATE "to_date(:LAST_UPDATE_DATE, case when regexp_substr(:LAST_UPDATE_DATE,'\w+',1,2)=regexp_substr(:LAST_UPDATE_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)"
)

使用此.ctl脚本:

load data
append
into table schema_name.table_name
fields terminated by ';' optionally enclosed by '"'
(
PRIMARY_ID,
ID_VALUE,
CREATED_DATE "to_date(:CREATED_DATE, case when regexp_substr(:CREATED_DATE,'\w+',1,2)=regexp_substr(:CREATED_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)",
LAST_UPDATE_DATE "to_date(:LAST_UPDATE_DATE, case when regexp_substr(:LAST_UPDATE_DATE,'\w+',1,2)=regexp_substr(:LAST_UPDATE_DATE,'\d+',1,2) then 'YYYY-MM-DD HH24:MI:SS' else 'dd Mon YYYY HH24:MI:SS' end)"
)

您可以将varchar列加载到staging表中,并从中进行转换(或使用外部表).但我不确定你能在.ctl中做多少。我会担心其他专栏中不太明显的问题,或者——尽管这似乎不是示例中的问题——mm/dd和dd/mm之间的混淆,这可能会导致微妙的损坏或失败。我不认为期望有合理的数据是不合理的。合理性并不总是存在的当然,我会参与进来的……你是合伙人