首页 > 解决方案 > 为什么我不能将 yyyymmdd(存储为文本)插入日期列

问题描述

这已经被问过很多次了,在发布这个问题之前我尝试了很多次。我的 SQL Server 表上有 2 列,其中日期存储为 CHAR(8) yyyymmdd 格式。当我尝试将其插入到另一个带有日期列的表中时,我得到:

从字符串转换日期和/或时间时转换失败。

我使用的类型转换是:

    ,CAST(convert(char(10),qrda.BillFromDate,120) AS DATE) AS [BillStartDate]
    ,CAST(convert(char(10),qrda.BillToDate,120) AS DATE) AS [BillEndDate]

使用上面的代码,我试图使其 SQL Server 可读日期格式,然后将其类型转换为 DATE,以便我可以将其插入目标表而无需任何其他转换。不知道我哪里出错了。

标签: sqlsql-servertsqldatetimetype-conversion

解决方案


由于日期以以下格式存储,yyyyMMdd您可以插入这些值而无需使用CONVERTCAST函数,因为这种格式可以隐式转换为 DATE。

如果数据中包含诸如 等无效值00000000,可以使用TRY_CONVERTorTRY_PARSE函数将这些值转换为NULL

例子:

CREATE TABLE #TBLTEMP(datecolumn DATETIME)


INSERT INTO #TBLTEMP(datecolumn)
VALUES ('20180101')

INSERT INTO #TBLTEMP(datecolumn)
VALUES (TRY_PARSE('00000000' as DATETIME))


SELECT * FROM #TBLTEMP

结果:

在此处输入图像描述

从上面的示例中,您可以看到20180101在没有任何转换的情况下成功插入,而TRY_PARSE函数将无效值转换00000000NULL.

您可以使用以下语法:

INSERT INTO TargetTable(DateColumn)
SELECT TRY_PARSE([CharColumn] as DATETIME
FROM SourceTable

参考


推荐阅读