如何将00d 00h 07m 42s格式的nvarchar数据转换为时间值
解决SQL中时长字符串转指定格式的问题
针对你遇到的nvarchar类型时长字符串(如00d 00h 02m 07s)转成00:00:02:07格式的需求,你之前的嵌套REPLACE因误删了天分量的内容导致转换失败,以下是两种可靠的解决方法:
方法1:精准提取各时间分量后拼接(兼容非标准位数)
这种方式能适配不同位数的数字(比如1d 5h 3m 45s这类格式),稳定性更强:
SELECT -- 提取天部分并补两位零 RIGHT('00' + SUBSTRING([ERGTalk time], 1, CHARINDEX('d', [ERGTalk time]) - 1), 2) + ':' -- 提取小时部分并补两位零 + RIGHT('00' + SUBSTRING([ERGTalk time], CHARINDEX('d ', [ERGTalk time]) + 2, CHARINDEX('h', [ERGTalk time]) - CHARINDEX('d ', [ERGTalk time]) - 2), 2) + ':' -- 提取分钟部分并补两位零 + RIGHT('00' + SUBSTRING([ERGTalk time], CHARINDEX('h ', [ERGTalk time]) + 2, CHARINDEX('m', [ERGTalk time]) - CHARINDEX('h ', [ERGTalk time]) - 2), 2) + ':' -- 提取秒部分并补两位零 + RIGHT('00' + SUBSTRING([ERGTalk time], CHARINDEX('m ', [ERGTalk time]) + 2, CHARINDEX('s', [ERGTalk time]) - CHARINDEX('m ', [ERGTalk time]) - 2), 2) AS [ERGTalk Time Conversion] FROM 你的表名;
方法2:优化版REPLACE(适配标准格式)
如果你的数据都是XXd XXh XXm XXs的标准格式,只需调整REPLACE逻辑,保留天分量即可:
SELECT REPLACE( REPLACE( REPLACE( REPLACE([ERGTalk time], 'd ', ':'), 'h ', ':' ), 'm ', ':' ), 's', '' ) AS [ERGTalk Time Conversion] FROM 你的表名;
该语句会直接将00d 00h 02m 07s转换为00:00:02:07。
额外提示
- 若存在格式不规范的数据(如缺少某分量、多余空格),建议先通过
CASE WHEN或正则函数做合法性校验,再执行转换。 - 如果后续需要基于该时长做运算,建议将天、时、分、秒分别提取为数值类型存储,而非字符串格式。
内容的提问来源于stack exchange,提问作者Nrhoodie
相关产品推荐
相关产品推荐

