2009-06-09 10 views
2

私は、char(8)または20090609として定義された日付フィールドと、char(4)、または1230として定義された時間フィールドを持つSQLテーブルを持っています。このデータを別のテーブルに移動しています。新しいテーブルのsmalldatetimeフィールドに入力します。私のクエリは、このようなものです:キャストしないデータはどのようにして見つけることができますか?

INSERT NewTable(eventdate) 
SELECT 
    CAST((datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) as smalldatetime) 
FROM OldTable 

私はこれを実行すると、私はエラーを取得:

The conversion of char data type to smalldatetime data type resulted in an out-of-range smalldatetime value.

私は、彼らがしていることを確認するために、LEN(datecol)とlen(timecol)をチェックしてみました少なくとも正しい文字数。どのように違反のあるデータや提案が見つかるか分かりません。データベースはSQL2000で、SMO 2008を使用しています。

答えて

0

は1900年1月1日は、精密検査でEDIT

2079年6月6日を通して、私は時間の第二の部分のためのサブパラメータがかもしれないと思う値間違った(全体の問題であるかもしれない)部分文字列を反映するために、次の更新(timecol、3、2)

新しいアプローチこのSQLはすべての日付の長さが8つの文字であり、すべての時間は4

あることを前提としていません
Select SubString(DateCol, 1, 4) as tehYear, 
Substring(DateCol, 5,2) as tehMonth, 
SubString(DateCol, 7,2) as tehDay, 
SubString(TimeCol, 1,2) as tehHour, 
Substring(TimeCOl, 3,4) as tehMinute, 
* 
from OldTable 
where 
(SubString(DateCol, 1,4) > 9999 or SubString(DateCol, 1,4) < 1753) 
OR (Substring(DateCol, 5,2) > 12 or Substring(DateCol, 5,2) < 1) 
OR (SubString(DateCol, 7,2) > 31 or SubString(DateCol, 7,2) < 1) 
OR (SubString(TimeCol, 1,2) > 23 or(SubString(TimeCol, 1,2) < 0) 
OR (Substring(TimeCOl, 3,4) > 59 or Substring(TimeCOl, 3,4) <0) 

datetimeにキャストし、問題のデータを特定するためにその範囲外の日付があるかどうかを確認してください。

SELECT 
    CAST((datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) 
    as datetime) 
    FROM OldTable 
    Where CAST((datecol + ' ' + substring(timecol, 1, 2) 
    + ':' + substring(timecol, 3, 2)) as datetime) 
    > Cast('06/06/2079' as datetime) or CAST((datecol + ' ' 
    + substring(timecol, 1, 2) + ':' + substring(timecol, 3, 2)) as datetime) 
    < Cast('01/01/1900' as datetime) 
+0

良いアプローチは、1月から12月までの1ヶ月と1日から28日の間のチェックで、多くのエラーをフィルタリングする必要があります。 – tekBlues

+0

私はアプローチも気に入っていますが、 "charデータ型をdatetimeデータ型の結果、範囲外のdatetime値が発生しました。 – scottm

+0

あなたは、あなたのサブストリングがあなたのタイムコードの第2部分のためにオフであると思っています、サブストリング(timecol、3、2)でなければなりません。 – cmsjr

-1

クエリアナライザでクエリを実行すると、エラーが発生した行がわかります。それは許容smalldatetime型の範囲外である可能性があり

+0

いいえ、私はちょうど影響を受けた行を取得します。 – scottm

6

これを試してみてください:

SELECT datecol, timecol 
FROM OldTable 
WHERE ISDATE(datecol + ' ' + substring(timecol, 1, 2) + ':' + substring(timecol, 2, 2)) = 0 

行が正常に変換できないあなたが表示されること。

+0

そのクエリは、date:20081024やtime:1657のようなデータを含む行を返しています。データを単独でキャストしようとすると、うまくキャストされます。 – scottm

+0

@OrbMan、私の例(とあなた)では、timecolの後半部分を取得する部分文字列が正しくありませんでした。私は部分文字列(timecol、3、2)に変更し、あなたの例を使用しましたが、同じエラーが発生します。 – scottm

+0

@ scotty2012、あなたは彼の例を正しく読んでいますか?彼の質問はあなたにはうまくいかないものを表示します。ですから、報告せずにワンショットでこれを行うには、ISDATE = 1のものを探してください。 –

関連する問題