将字符串转换为日期时间仅适用于选择但不能更新(T-SQL)

时间:2018-11-30 18:32:00

标签: sql sql-server-2016 sqldatetime sql-convert

我的数据库中有一个表,该表同时具有原始用户输入日期字符串,然后尝试使用CONVERT从中获取日期时间

CREATE TABLE #UserInput 
(
    actualDate DATETIME NULL,
    dateString VARCHAR(50) NULL
)

声明

SELECT CONVERT(DATETIME, dateString) 
FROM #UserInput 

工作正常,并将字符串正确转换为日期时间。

但是,当我尝试使用语句

设置actualDate列时
UPDATE X 
SET X.actualDate = CONVERT(DATETIME, X.dateString) 
FROM #UserInput X 

我得到了错误:

  

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

因为我可以运行select,所以我知道所有dateStrings的格式都正确,可以转换。那我为什么不能通过更新来做到这一点?

我正在测试的特定格式是mm / dd / yyyy hh:mm,但是该解决方案还需要处理其他格式。

谢谢您的帮助,

2 个答案:

答案 0 :(得分:1)

CREATE TABLE #UserInput (
actualDate datetime NULL,
dateString varchar(50) NULL)

insert #UserInput(dateString) values('20181231 12:15')

SELECT CONVERT(datetime, dateString) 
FROM #UserInput 

UPDATE X 
SET X.actualDate = CONVERT(datetime, X.dateString) 
FROM #UserInput X 

select * from #UserInput

我测试了两种格式的yyyymmdd hh:mm和mm / dd / yyyy hh:mm,此代码可以正常工作。我没有任何更新或选择运行错误。

答案 1 :(得分:0)

简单的解决方法是try_convert()

UPDATE X 
    SET X.actualDate = TRY_CONVERT(DATETIME, X.dateString) 
    FROM #UserInput X ;

我怀疑问题是您没有看到X中的 all 行,只有少数匹配的行。要对此进行测试,请运行:

select X.*
from #userinput X
where try_convert(datetime, x.dateString) is null;