2016-01-12 3 views
0

У меня есть плоский файл, который я импортирую в промежуточную таблицу SQL Server 2005 в качестве символьных данных.преобразование varchar на сегодняшний день/Использование isdate()

Мне нужно преобразовать поле дня рождения в формат даты и времени при копировании его в конечную таблицу назначения. Я делал так, используя следующее:

BIRTHDAY = case when isdate(DOB)=1 then convert(datetime, '19'+right(DOB, 2)+left(DOB, 2)+substring(DOB,3,2)) else null end 

Проблема только 100+ из дней рождения из 32k + файла идентифицированы как даты.

Я не вижу разницы между теми, которые являются датами, и теми, которые не являются. Я включил выборку ниже.

good date bad date 
41129 100465 
10531 122467 
10429 20252 
81030 62661 
31231 20959 
11028 91965 
80928 60665 

ответ

0

Похоже, что исходные данные находятся в MMDDYY, но месяцы не являются 0-padded.

Основываясь на этом предположении, вы можете разобрать детали, как дата ниже и перестраивать DateTime:

declare @raw table (dob varchar(100)); 
insert into @raw 
select '41129' union all 
select '10531' union all 
select '10429' union all 
select '81030' union all 
select '31231' union all 
select '11028' union all 
select '80928' union all 
select '100465' union all 
select '122467' union all 
select '20252' union all 
select '62661' union all 
select '20959' union all 
select '91965' union all 
select '60665' 


select *, 
     [asDate] = dateadd(day, dd - 1, dateadd(month, mm - 1, dateadd(year, ('19' + yy)-1900, 0))) 
from ( select dob, 
        substring(right('0' + dob, 6), 1, 2), 
        substring(right('0' + dob, 6), 3, 2), 
        substring(right('0' + dob, 6), 5, 2) 
      from @raw 
     ) as stage (string, mm, dd, yy); 
Смежные вопросы