2009-06-04 2 views
2

私は、何らかの理由でdatetimeの代わりにvarcharとして格納されている日付を持つ1つの列を持つ従来のSQL Server 2000データベースを持っています。私はこのデータに対してビューを作成し、フィールドに対してレポートを作成しやすくするためにvarcharの代わりにdatetimeフィールドを使用したいと考えています。良いことは、の値のうちがdatetimeに直接キャストできなければならないように見えることです。varchar値がdatetimeにキャストできない行のリストを取得できますか?

もちろん、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. ゲット私がそれを修復することができる場合に、誕生日をdatetimeにキャストできないすべての行のリスト?
  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と私の質問に私を打ち負かすとジョエルのコメント。 –

+0

@Joel Coehoorn:NULL = 0も真ではないので、問題はありません – wqw

関連する問題