寻求将整数格式日期转换为'yymm'格式的更高效SQL实现方法
寻求将整数格式日期转换为'yymm'格式的更高效SQL实现方法
嘿,针对你处理3000万行的大表的整数日期转换需求,我有几个更高效的方案推荐!先说说你当前的实现——虽然能得到正确结果,但多次类型转换(int→字符串→日期→字符串)的开销在大数据量下会非常可观,咱们来优化一下:
方法一:纯数学运算(性能最优,无类型转换开销)
因为你的日期字段是YYYYmmdd格式的整数,完全可以通过算术运算直接提取yymm部分,全程不需要任何类型转换,这对大表来说是效率最高的方式:
SELECT CAST((Date_Field / 100) % 10000 AS CHAR(4)) AS ConvertedDate FROM #MyTestTable;
逻辑解释:
Date_Field / 100:把整数末尾的两位日期(dd)去掉,得到YYYYmm格式的整数(比如20231031变成202310)% 10000:取这个结果的后四位,得到yymm格式的整数(比如202310变成2310)CAST(...) AS CHAR(4):转成字符串格式,和你原需求的输出一致
如果想要更简洁的写法,也可以用RIGHT函数直接截取后四位:
SELECT RIGHT(Date_Field / 100, 4) AS ConvertedDate FROM #MyTestTable;
方法二:字符串截取(直观易读,仅一次类型转换)
如果数学运算的逻辑对你来说不够直观,也可以选择只做一次类型转换后截取字符串:
SELECT SUBSTRING(CAST(Date_Field AS CHAR(8)), 3, 4) AS ConvertedDate FROM #MyTestTable;
逻辑解释:
CAST(Date_Field AS CHAR(8)):把整数转成固定8位的字符串(比如20231031变成'20231031')SUBSTRING(..., 3, 4):从第3个字符开始截取4个字符,刚好得到'2310'这样的yymm格式
为什么原方法效率低?
你原来的代码做了三次嵌套转换:int→CHAR(8)→DATETIME→CHAR(4),每一层转换都会消耗额外的CPU资源。在3000万行的数据集上,这种累积的开销会被放大,导致查询速度变慢。上面的两种方法要么完全避免转换,要么只做一次转换,性能提升会非常明显。
测试验证
用你的测试表验证一下这两种方法的效果:
CREATE TABLE #MyTestTable (Date_Field int); INSERT INTO #MyTestTable (Date_Field) VALUES (20231031), (20230917); -- 测试方法一 SELECT CAST((Date_Field / 100) % 10000 AS CHAR(4)) AS ConvertedDate FROM #MyTestTable; -- 输出结果:2310、2309 -- 测试方法二 SELECT SUBSTRING(CAST(Date_Field AS CHAR(8)), 3, 4) AS ConvertedDate FROM #MyTestTable; -- 输出结果:2310、2309 DROP TABLE #MyTestTable;
备注:内容来源于stack exchange,提问作者S Grimminck
相关产品推荐
相关产品推荐

