Ну, во-первых, с какой стати вы храните значения даты и времени в столбце varchar?Это основной грех по ряду причин, не в последнюю очередь из-за того, что вы не получаете никакой проверки того, что данные являются (или могут быть преобразованы) датой-временем.Вам также следует рассмотреть возможность проверки входных данных, даже если вы оставите столбец как varchar, чтобы у вас не было такого большого количества потенциальных форматов, которые вы хотели бы считать допустимыми.немного от @G Mastros:
DECLARE @f TABLE(i INT, d VARCHAR(32));
INSERT @f VALUES
(1,'15/04/76'),
(2,'15/04/1976'),
(3,'1/3/1976'),
(4,'1/3/76'),
(5,'15/3/1976'),
(6,'22/22/22'),
(7,'Yesterday');
SET DATEFORMAT DMY;
SELECT i, d, d2 = CASE WHEN ISDATE(d) = 1
AND d LIKE '%/[0-9][0-9][0-9][0-9]'
THEN CONVERT(DATETIME, d, 103) END
FROM @f;
Результаты:
i d d2
- ---------- -----------------------
1 15/04/76 NULL
2 15/04/1976 1976-04-15 00:00:00.000
3 1/3/1976 1976-03-01 00:00:00.000
4 1/3/76 NULL
5 15/3/1976 1976-03-15 00:00:00.000
6 22/22/22 NULL
7 Yesterday NULL
PS Это будет отличный случай для TRY_CONVERT
в SQL Server 2012. Этоделает именно то, что вы спрашиваете - он пытается преобразовать в указанный тип данных;если не может, возвращается NULL
.