2014-01-20 3 views
-1

데이터를 가져오고 expirationDate (varchar(4000))를 DATE로 변환하도록 제공된 테이블이 SQL Server에 있습니다.잘못된 날짜 값을 필터링합니다.

이 테이블에는 다른 날짜가있는 Excel 시트가 채워졌습니다.

어떻게 든 모든 형식을 하나의 형식으로 변환하고 SELECT 문과 함께 DATE으로 캐스팅해야합니다. expirationDate에서

샘플 데이터 :

2099-09-09 
NULL 
NA 
8/25/12 
12/21/11 
na 
2010-11-07 
2013-10-07 
NULL 
3/25/12 
tbd 
NA 
N/A 
2009-04-17 
2011-02-21 
02/15/2011 
08/31/11 
NULL 
2012-11-06 
na 
2011-12-21 
2011-10-09 
NA 
2009-04-17 
NA 
2/29/12 

내가 시도 :

select CASE WHEN ISDATE(expirationDate) = 1 THEN CAST(expirationDate AS DATE) 
     ELSE cast(null as DATE) END 
FROM [dbo].[ComponentData] 

하지만 던지고 오류 : 나는 또한 시도

Conversion failed when converting date and/or time from character string. 

:

CONVERT(varchar(4000),CAST(expirationDate AS DATE),100) 
,

하지만 똑같은 ... ... (

누구든지 해결할 수 있습니까?

+0

where 절에서 isDate를 사용하여 두 단계로 시도해보십시오. CASE가 항상 단락 회로 평가를 사용하지 않는다는 사실에 문제가있을 수 있습니다. – JohnFx

+0

[dbo]의 에서 CONVERT (varchar (4000), CAST (expirationDate AS DATE), 100) 을 선택하십시오. 여기서 ISDATE (expirationDate) = 1 여전히 오류 발생 – Angelina

+0

사용중인 SQL 버전은 무엇입니까? 나는 생각을 가지고 있을지도 모른다. – JohnFx

답변

2

내가 그것을 가지고 :

테스트를 :

select CAST(REPLACE(CONVERT(NVARCHAR, componentExpirationDate,103), '/', '-') as date) 
from [dbo].[BatchComponent] 
where ISDATE(componentExpirationDate) = 1 

출력 : 당신의 도움을

select CASE WHEN ISDATE(expirationDate) = 1 THEN CAST(REPLACE(CONVERT(NVARCHAR, expirationDate,103), '/', '-') as date) 
     ELSE cast(null as date) END 
    FROM [dbo].[ComponentData] 

이 여러분 모두 감사합니다 : CASE에

2099-09-09 
2012-01-11 
2010-09-27 
2012-08-25 
2011-12-21 
2010-09-01 
2016-02-02 
2009-05-08 
2010-11-07 
2013-10-07 

변경합니다.

+1

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar --without- length.aspx –

관련 문제