求助:在UPDATE语句中将Idx20列转换为yyyy/mm/dd hh:mm:ss.mmm格式datetime
解决日期转换为datetime类型的问题
我明白你现在卡在把Idx20列转换成指定格式的datetime类型上了,之前用CAST没成功,咱们一步步来解决这个问题:
首先得明确两个关键点:
- 数据库里的datetime类型本身不存储格式,它是一个时间戳数值,格式只是查询或显示时的表现形式。如果你是想把DEL.Idx7的内容转换成datetime类型存储到SMS.Idx20,重点是先把DEL.Idx7正确转换为datetime,再做时间调整;如果SMS.Idx20是字符串类型,那才需要把datetime格式化为你要的
yyyy/mm/dd hh:mm:ss.mmm字符串。
针对你的UPDATE语句,我给你两种场景的修改方案:
场景1:SMS.Idx20是datetime/datetime2类型
如果目标列是datetime类型,咱们需要先确保DEL.Idx7能正确转换成datetime,再减去1小时。这里推荐用TRY_CONVERT替代CAST,它能避免无效日期导致整个UPDATE失败:
UPDATE SMS SET SMS.Idx15 = DEL.Idx4, SMS.Idx16 = DEL.Idx5, -- 先把DEL.Idx7转成datetime,再减1小时 SMS.Idx20 = DATEADD(HOUR, -1, TRY_CONVERT(DATETIME, DEL.Idx7, 121)) FROM idmsSMSOutBox SMS INNER JOIN idmsSMSDelivery DEL ON RIGHT(SMS.Idx3,8) = DEL.Idx3 WHERE SMS.Idx15 = 'Delivering' -- 可选:过滤掉转换失败的记录,避免Idx20被设为NULL -- AND TRY_CONVERT(DATETIME, DEL.Idx7, 121) IS NOT NULL
- 这里的
121是SQL Server的日期格式代码,对应yyyy-mm-dd hh:mi:ss.mmm(24h),如果DEL.Idx7的原始格式是其他的(比如dd/mm/yyyy),需要换成对应的格式代码(比如103)。你可以先跑这条测试语句确认转换是否正确:SELECT DEL.Idx7, TRY_CONVERT(DATETIME, DEL.Idx7, 121) AS converted_date FROM idmsSMSDelivery
场景2:SMS.Idx20是字符串类型(需存储为指定格式)
如果必须把日期以yyyy/mm/dd hh:mm:ss.mmm的字符串形式存储,那需要先转换为datetime,调整时间后再格式化为字符串,同时替换掉默认的-为/:
UPDATE SMS SET SMS.Idx15 = DEL.Idx4, SMS.Idx16 = DEL.Idx5, SMS.Idx20 = REPLACE( CONVERT(VARCHAR(23), DATEADD(HOUR, -1, TRY_CONVERT(DATETIME, DEL.Idx7, 121)), 121), '-', '/' ) FROM idmsSMSOutBox SMS INNER JOIN idmsSMSDelivery DEL ON RIGHT(SMS.Idx3,8) = DEL.Idx3 WHERE SMS.Idx15 = 'Delivering'
VARCHAR(23)刚好能容纳yyyy/mm/dd hh:mm:ss.mmm的长度,避免截断。
额外排查建议
如果之前用CAST失败,大概率是DEL.Idx7里有不符合日期格式的数据,你可以用这条语句找出这些无效记录:
SELECT DEL.Idx7 FROM idmsSMSDelivery WHERE TRY_CONVERT(DATETIME, DEL.Idx7, 121) IS NULL
先修正这些无效数据,再执行UPDATE会更稳妥。
内容的提问来源于stack exchange,提问作者M. Smith
相关产品推荐
相关产品推荐

