为什么我不能将yyyymmdd(存储为文本)插入日期列

时间:2019-09-10 20:45:29

标签: sql sql-server tsql datetime type-conversion

这个问题已经被问过很多次了,在发布这个问题之前我做了很多尝试。我在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,以便可以将其插入目标表而无需任何其他转换。不知道我要怎么做。

2 个答案:

答案 0 :(得分:4)

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

如果数据包含无效值,例如00000000,则可以使用TRY_CONVERTTRY_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

结果:

enter image description here

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

您可以使用以下语法:

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

参考文献

答案 1 :(得分:1)

对麻烦的人表示抱歉,但看起来这是错误的生产数据,其中某些值的字面值是'00000000'。我不知道它如何流入我们的系统,但是由于源表列是CHAR(8),所以这是一个有效值。对我来说不是那么多。