为什么在Date列中追加NULL会导致显示值1900-01-01?

时间:2018-02-14 23:40:45

标签: sql sql-server tsql ssis etl

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

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

当我运行insert语句时,目标表中的结果值都显示日期的 1900-01-01 ,而不是 NULL 或空白。我尝试将值强制为null,但它不起作用:

File::Temp

如何使Date列只接受空值或空值?

4 个答案:

答案 0 :(得分:2)

如果为'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]

答案 1 :(得分:1)

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

如果输入的类型为Date:

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

如果输入列的类型为 string

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

并将此列映射到目标列

答案 2 :(得分:0)

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

enter image description here

答案 3 :(得分:0)

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

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