2009-06-04 8 views
2

어떤 이유에서 건 datetime 대신 varchar로 저장된 날짜가있는 하나의 열을 가진 레거시 SQL Server 2000 데이터베이스가 있습니다. 이 데이터에 대해 뷰를 만들고 varchar 대신 datetime 필드를 사용하여 필드에 대한 보고서를 쉽게 작성하려고합니다. 좋은 소식은 의 값 중이 datetime으로 직접 캐스팅 될 수있는 것처럼 보입니다.datetime에 캐스팅 할 수없는 varchar 값이있는 행 목록을 가져올 수 있습니까?

물론 분명히 datetime에 캐스팅 할 수없는 방식으로 입력 된 일부 필드가 있습니다.

CREATE TABLE dbo.user 
(
    ... 
    birthdate varchar(10) 
    ... 
) 

을 그리고보기는 다음과 같을 수 있습니다 : : 그냥 명확성을 위하여, 여기에 테이블을 볼 수있는 방법은

CREATE VIEW dbo.UserView 
AS 
SELECT ... 
     CAST(u.birthdate AS datetime) AS birthdate 
     ... 
FROM user u 
WHERE ... 

내가 할 수있는 방법이 있나요 :

  1. 얻을 내가 고칠 수있는 경우 생년월일을 캐스팅 할 수없는 모든 행 목록
  2. 값을 복구 할 수없는 경우 값이 NULL로 표시되거나 분명히 표시 될 수 있습니다. 아니요 사용자의 실제 생년월일?

답변

5

사용 IsDate()

SELECT birthdate, ' ' _, * 
FROM user u 
WHERE IsDate(u.bithdate) != 1 

SELECT ... 
    CAST(CASE WHEN IsDate(u.birthdate) = 1 THEN u.birthdate ELSE NULL END AS datetime) AS birthdate 
    ... 
FROM user u 
WHERE ... 
2

보여 나쁜 행 :

select * from dbo.user where isdate(birthdate)!=1 

보기 :

SELECT ... 
    CASE 
     WHEN isdate(birthdate)=1 THEN CAST(u.birthdate AS datetime) 
     ELSE NULL 
    END AS Birthday 
     ... 
FROM user u 
WHERE ... 
+0

작은 것이지만 좋은 점은! = 0보다는 1입니다. 이 특정 함수는 항상 1 또는 0을 반환하지만 많은 함수는 NULL 입력에 대해 NULL을 반환하며 성공 결과에 대해 구체적으로 테스트하는 것이 좋습니다. –

+0

+1 나를 조롱하고 Joel의 의견을 구하십시오. –

+0

@Joel Coehoorn : NULL = 0도 사실이 아니므로 – wqw