这个问题已经被问过很多次了,在发布这个问题之前我做了很多尝试。我在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,以便可以将其插入目标表而无需任何其他转换。不知道我要怎么做。
答案 0 :(得分:4)
由于日期以下面的格式yyyyMMdd
存储,因此您可以插入这些值而无需使用CONVERT
或CAST
函数,因为该格式可以隐式转换为DATE。 / p>
如果数据包含无效值,例如00000000
,则可以使用TRY_CONVERT
或TRY_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
函数将无效值00000000
转换为NULL
。
您可以使用以下语法:
INSERT INTO TargetTable(DateColumn)
SELECT TRY_PARSE([CharColumn] as DATETIME
FROM SourceTable
答案 1 :(得分:1)
对麻烦的人表示抱歉,但看起来这是错误的生产数据,其中某些值的字面值是'00000000'。我不知道它如何流入我们的系统,但是由于源表列是CHAR(8),所以这是一个有效值。对我来说不是那么多。