将varchar转换为日期/使用isdate()

时间:2016-01-12 14:03:30

标签: sql-server-2005

我有一个平面文件,我将其作为字符数据导入SQL Server 2005登台表。

我需要在将生日字段复制到最终目标表时将生日字段转换为日期时间格式。我这样做是使用以下内容:

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

问题是32k +文件中只有100多个生日被识别为日期。

我看不出日期和不日期之间的区别。我在下面提供了一个样本。

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

1 个答案:

答案 0 :(得分:0)

看起来原始数据是MMDDYY,但月份不是0填充。

在此假设的基础上,您可以解析下面的日期部分并重建日期时间:

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);