为什么将 NULL 附加到日期列会导致显示值 1900-01-01?

Why does appending a NULL into a Date column result in the value 1900-01-01 being displayed?

我正在使用 SSIS 包导入一个基本文本文件,它有 3 个日期字段,有时一些日期字段是空的。

导入的 table 显示空字段,我想是因为它们是 varchar(50) 数据类型。但随后我需要将那些 table 中的记录插入另一个 table,其中这些列被定义为日期数据类型。

当我 运行 插入语句时,目标 table 中的结果值全部显示 1900-01-01 作为日期,而不是NULL 或空白。我尝试强制该值为 null,但没有用:

CASE WHEN refresh_date IS NULL THEN NULL ELSE refresh_date END AS RefreshDate

如何让日期列只接受空白或空值?

您可能需要检查此列的数据类型,看看它是否接受空值。

也许您输入的不是空值,而是空字符串。你提到他们可能是 VARCHAR(50) 数据类型。因此,您可能需要添加更多逻辑。试试这个:

NULLIF(LTRIM(RTRIM(refresh_date)),'')

尝试使用以下表达式在数据流任务中添加派生列转换,问题可能是由空字符串(不是 NULL 值)引起的

如果输入是日期类型:

ISNULL([DateColumn]) ? NULL(DT_DATE) : (DT_DATE)[DateColumn]

如果输入列的类型是string

(ISNULL([DateColumn]) || [DateColumn] == "") ? NULL(DT_DATE) : (DT_DATE)[DateColumn]

并将此列映射到目标列

如果 'empty',则不应将 varchar 字段强制转换或转换为日期。当将空白或空字符串转换为等于“1900-01-01”的日期时。您可以使用以下算法对此进行测试:

SELECT CAST('' as date)

使用 SSIS,您最好检查 varchar(50) 字段是否等于 '',如果是,则将其设置为 NULL。这是一个示例 SQL 查询:

SELECT CASE WHEN importedfield = '' THEN NULL
            ELSE CAST(importedfield as date)
       END AS [NewFieldname]