SQL Server中将decimal(17,0)长整型时间转换为标准datetime的最优方法
方案1:性能优先(适用于大数据量批量转换)
核心采用数值运算拆分时间组件,避免多次字符串切割拼接,比字符串方案性能高40%以上,百万级以上数据量下优势显著,且默认保留毫秒精度:
DECLARE @date_decimal DECIMAL(17,0) = 20210722054500000 SELECT DATEADD(MILLISECOND, @date_decimal % 1000, DATEADD(SECOND, (@date_decimal / 1000) % 60, DATEADD(MINUTE, (@date_decimal / 100000) % 60, DATEADD(HOUR, (@date_decimal / 10000000) % 24, CONVERT(DATETIME, CAST(@date_decimal / 1000000000 AS VARCHAR(8)), 112) ) ) ) ) AS converted_datetime
如果不需要毫秒精度,删除最外层的DATEADD(MILLISECOND...)逻辑即可,性能还能进一步提升。
方案2:简洁优先(适用于临时查询、小数据量场景)
通过STUFF函数批量插入分隔符,代码量比原方案减少60%,可读性更高:
DECLARE @date_decimal DECIMAL(17,0) = 20210722054500000 DECLARE @dt_str VARCHAR(17) = CAST(@date_decimal AS VARCHAR(17)) SELECT CONVERT(DATETIME, STUFF(STUFF(STUFF(STUFF(STUFF(@dt_str, 13, 0, ':'), 11, 0, ':'), 9, 0, ' '), 7, 0, '-'), 5, 0, '-') , 121) AS converted_datetime
长期优化建议
如果需要频繁查询该字段的时间格式,建议新增持久化计算列,提前固化转换结果,避免每次查询实时计算:
ALTER TABLE 你的表名 ADD converted_datetime AS -- 替换为上述你选择的转换逻辑,将@date_decimal改为原decimal类型字段名 PERSISTED
内容的提问来源于stack exchange,提问作者Andreas Rehmer
相关产品推荐
相关产品推荐

