这是我对这个 3 年老问题的解决方案。我没有任何空格,但是您可以以此为基础,并在评估时使用替换功能将其删除。给你,互联网。感谢过去 10 年的所有帮助。这是相当特定于 SQL 数据导入导出的,但希望能帮助那些陷入手动 ETL 模式的人。
CASE WHEN DOB LIKE '__/__/____' THEN [DOB] -- PROPER FORMAT
WHEN DOB LIKE '_/__/____' THEN '0'+ [DOB] -- NEED TO ADD A ZERO TO THE MONTH
WHEN DOB LIKE '__/_/____' THEN LEFT(DOB,3)+'0'+RIGHT(DOB,6) -- NEED TO ADD A ZERO TO THE DAY
WHEN DOB LIKE '_/_/____' THEN '0'+LEFT(DOB,2)+'0'+RIGHT(DOB,6) -- NEED TO ADD A ZERO TO THE MONTH AND DAY
WHEN LEN(DOB)=8 AND DOB BETWEEN '1900' AND '2016' THEN LEFT(RIGHT(DOB,4),2) + '/' + RIGHT(DOB,2) +'/'+ LEFT(DOB,4)
WHEN LEN(DOB)=8 AND DOB BETWEEN '01011900' AND '12312016' AND DOB NOT LIKE '%/%' THEN LEFT(DOB,2) + '/' + RIGHT(LEFT(DOB,4),2) +'/'+ RIGHT(DOB,4)
WHEN DOB LIKE '__/__/__' -- CONVERT FROM MM/DD/YY (ADD TWO DIGIT YEAR PREFIX)
THEN CASE WHEN RIGHT(replace(dob,'/',''),2) > RIGHT(YEAR(GETDATE()),2) --WHEN 2-DIGIT YEAR IS WITHIN 100 YEARS AGO USE 19
THEN LEFT(DOB,2)+'/'+LEFT(RIGHT(replace(dob,'/',''),4),2)+'/19'+RIGHT(replace(dob,'/',''),2)
WHEN RIGHT(DOB,2) < RIGHT(YEAR(GETDATE()),2) --WHEN 2-DIGIT YEAR IS MORE THAN 100 YEARS AGO USE 20
THEN LEFT(DOB,2)+'/'+LEFT(RIGHT(replace(dob,'/',''),4),2)+'/20'+RIGHT(replace(dob,'/',''),2)
ELSE NULL END
ELSE NULL END AS [DOB_CONVERTER]
正如 Max Vernon 所指出的,您必须考虑要匹配和修复的每个模式。错误处理可以很好地实现自动化。在那之前,一旦数据被清理,就会查看数据,加载到临时表并使用类似的模式查找坏人(WHERE NULL 以查找非模式匹配)(WHERE RIGHT(LEFT(REPLACE([DOB],'/',' '),4),2) > 31
模式搜索是 microsoft.com 上的一个有用站点
https://technet.microsoft.com/en-us/library/ms187489(v=sql.105).aspx