あなたが説明した潜在的なフォーマットのセットについて:
DECLARE @x TABLE(y VARCHAR(32))
INSERT @x VALUES
('11181980'),
('8 18 1960'),
('10/01/1960'),
('04-12-1953'),
('041371'),
('7/29/44'),
(''),
(NULL);
SET DATEFORMAT MDY;
SELECT CONVERT(DATETIME, CASE WHEN y LIKE '%/%' THEN y
WHEN LEN(RTRIM(y)) = 0 THEN NULL
WHEN LEN(RTRIM(y)) IN (6,8) AND ISNUMERIC(y) = 1 THEN
STUFF(STUFF(y,3,0,'/'),6,0,'/') END)
FROM (SELECT y = REPLACE(REPLACE(y, ' ', '/'), '-', '/') FROM @x) AS x;
これは、サーバー設定に基づいてではなく、7/29/44
として解釈されます。すべての日付が過去のものであることを確認するには、次のようにします。2044
1944
SELECT y = DATEADD(YEAR, CASE WHEN y > GETDATE() THEN -100 ELSE 0 END, y)
FROM
(
SELECT y = CONVERT(DATETIME, CASE WHEN y LIKE '%/%' THEN y
WHEN LEN(RTRIM(y)) = 0 THEN NULL ELSE
STUFF(STUFF(y, 3, 0, '/'),6, 0, '/') END)
FROM (SELECT y = REPLACE(REPLACE(y, ' ', '/'), '-', '/') FROM @x) AS x
) AS z;
これは、日付にマッサージできないガベージデータがないことにも依存します。とにかく、どのようなシステムがこの種の一貫性のないナンセンスに入りますか?
SQL Server 2012では、TRY_PARSEまたはTRY_CONVERTを使用できますが、そのようなフォーマットの混乱がある場合でも、意味のある結果を得るには、マッサージを行う必要があります。