【问题标题】:SSIS DT_STR to DT_DBDATE using Derived columnSSIS DT_STR 到 DT_DBDATE 使用派生列
【发布时间】:2021-04-14 14:31:36
【问题描述】:

我有一个带有日期字段的固定格式 .txt 文件。此字段可能有日期或为空白。我绞尽脑汁让这个字段在派生列转换中从DT_STR 转换为DT_DBDATE。我尝试了多种场景:

[CHNG_DT] == "" ?  ISNULL((DT_DBDATE)[CHNG_DT] ) : (DT_DBDATE)SUBSTRING([CHNG_DT], 1, 4)) + "-" + (DB_DBDATE)(SUBSTRING(CHNG_DT], 6, 2)) + "-" + (DB_DBDATE)(SUBSTRING([CHNG_DT], 9, 2))

[CHNG_DT] == "" ? NULL(DB_DBDATE) : (DB_DBDATE)[CHNG_DT]

ISNULL([CHNG_DT]) ? NULL(DT_DBDATE) : (DT_DBDATE)((DT_STR, 10, 1252)[CHNG_DT])

ISNULL(CHNG_DT) ? NULL(DT_DBDATE) : (DT_DBDATE)((DT_STR,10,1252)CHNG_DT)

LEFT([CHNG_DT], 10) == "          " ? ISNULL((DT_DBDATE)[CHNG_DT]) : (DT_DBDATE)[CHNG_DT]

(DT_DBDATE)CHNG_DT

【问题讨论】:

  • 日期值以什么格式存储?能否提供数据样本?
  • 文件中的日期格式为yyyy-mm-dd,也可以为空。

标签: sql-server date ssis etl derived-column


【解决方案1】:

首先,当您希望将值从DT_STR 转换为DT_DBDATE 时,您应该确保这些值以yyyy-MM-dd 格式存储。可以参考以下官方文档了解更多:

第二个建议是使用LTRIM()RTRIM() 函数来确保日期值的开头和结尾没有空白。举个例子:

LTRIM(RTRIM(REPLACENULL([CHNG_DT],""))) == "" ? NULL(DT_DBDATE) : (DT_DBDATE)LTRIM(RTRIM([CHNG_DT]))

如果日期值以不同的格式存储,您应该在将其转换为DT_DBDATE 之前编写一个更改格式的表达式。举个例子:

其他有用的答案:

【讨论】:

  • 文件中的日期格式为 yyyy-mm-dd 或者可以为空。无论哪种方式,它在文件中都是相同的 10 个位置。如果它是空白的,那么我需要将其转换为 NULL 以存储在表中。
  • 我们确定这里的部分问题是表上的字段定义,CMBL_CHDT 日期不为空。我将其更改为 CMBL_CHDT null,然后能够使用 CHNG_DT == " " ? NULL(DT_DBDATE) : (DT_DBDATE)CHNG_DT 以正确加载日期。
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多