2017-09-07 11 views
0

列「Col」に文字列「geb」が含まれている場合と含まれていない場合があります。それがないとき、私は、次の10個の文字を抽出し、DATETIMESELECT TOPを使用しない場合の変換エラー

ここにあります私のクエリに変換したい:

;WITH CTE AS 
(
    SELECT 
     TOP 100000000 
     Col, 
     CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd 
    FROM 
     T 
    WHERE 
     Col LIKE '%geb.%' 
) 
SELECT 
    Col, 
    bd 
FROM 
    CTE 
WHERE 
    bd <= '01.01.1950' 

上記のクエリが正常に動作します。私はTOP xxx文を省略し、WHERE句は、どのような方法でbdが含まれている場合(NULL IS、=/=「」、...!)私は、変換エラーを取得:

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

私はTOP xxxまたは削除を含む場合bd WHERE句からクエリがエラーなしで完了します。

ここでは何が起こっていますか?

答えて

1

あなたがTOP句またはWHERE条件を使用しないとき、あなたはあなたがDateTime転換フィルタリングしている'geb.'を次の文字がDateTime

に変換することはできませんいくつかのcol値を変換しようとしてしまうからです

使用TRY_CONVERT代わりL selectリストのいずれかで使用TOP又はWHERE句から値IKEこの:

TRY_CONVERT (data_type [ (length) ], expression [, style ]) 

用途:

TRY_CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd 

の代わりに:

CONVERT(DATETIME, SUBSTRING(Col, PATINDEX('%geb.%', Col) + 5, 10)) AS bd 
+0

が、私はちょうどCTE内でクエリを実行すると、クエリがまだ完了します。 2番目のWHERE句を削除するとCTEの結果が同じで、TOPを使用するかどうかにかかわらず、 – wuha

+0

提案された修正を試すことができます – Winnie

+0

これは、ありがたいことですが、それでも私の質問には答えません。選択/選択の結果セットはどのように異なっていますか?私は今実行計画を見ています。 – wuha

関連する問題