1

nvarchar(50)データ型に格納された m/d/yyyy 形式の日付の列を持つテーブルがあります(これを継承しました...)。これらの列を日付データ型に変換して正しく保存したいのですが、誤って列のデータを削除する余裕はありません。

デザイナーを使用してデータ型を日付に変更して、SQLサーバー2008R2でこれを試しました。これは私のテスト列では機能しましたが (日付を保持し、形式を修正したなど)、すべての null が 1900-01-01 になりました。私はそれで暮らすことができますが、もっと雄弁な解決策があるようです.

ただし、実際のデータ列で試してみると、エラーが発生しました。

テーブルを変更できません。文字列から日時を変換する際に変換に失敗しました。

これを処理する適切な方法は何でしょうか? これが重複している場合は申し訳ありません。私は1時間探していましたが、わかりませんでした。

4

5 に答える 5

3

SQLServerが日付に変換できないデータがテーブルのどこかにあるようです。これらの行に沿ってクエリを使用して行を見つけることができます。

SELECT * FROM TableName WHERE ISDATE(ColumnName) != 1

もちろん、TableNameとColumnNameを実際の名前に置き換える必要があります。

不良データのある行を特定したら、それを処理するのはあなた次第です...各行のデータを手動で変更し、nullに設定します。この場合、許容できると思われるものは何でもかまいません。

于 2013-02-07T16:34:43.903 に答える
0

おそらく、データ型がdateの列を一時的に複製できます。これにより、updateコマンドを実行して、varcharをdatetimeに変換し、この新しい列に格納できます。すべての情報が正しいことを確認したら、削除できます。列を変更し、新しい列の名前を元の名前に変更します。

変更データ型に関する情報を失わないようにする必要がある場合は、常にこれを行います。

于 2013-02-07T16:38:51.217 に答える
0

Dateデータ型の新しい列を追加し、データを変換/コピーして、最後に元の列を削除することをお勧めします。

于 2013-02-07T16:33:50.650 に答える
0

あなたにできることは

  1. タイプのテーブルに別の列を追加しますDATETIME

  2. 既存の列の値を次のようにキャストして、新しい列の値を更新しますDATETIME

  3. 既存の列を削除します

于 2013-02-07T16:34:26.120 に答える
0

次のクエリを使用してISO Format (yyyymmdd)、任意のサーバーで動作することを保証する日付を更新できます。SQL SERVER - DEMO'd/m/yyyy'は、 、'dd/m/yyyy''d/mm/yyyy'&のような日付の 4 つの可能なケースをカバーし、'dd/mm/yyyy'それらをに更新しますISO Format

Update mytable
Set d = right(d,charindex('/',reverse(d),1)-1) + 
            right('0' + substring(d, charindex('/',d,1) + 1, charindex('/', d, charindex('/',d,1) + 1 ) - charindex('/',d,1) -1 ),2) +
            right('0' + left(d,charindex('/',d,1)-1),2)

または、このメソッドを選択クエリで直接使用できます。

Select id,convert(date,
            right(d,charindex('/',reverse(d),1)-1) + 
            right('0' + substring(d, charindex('/',d,1) + 1, charindex('/', d,
                        charindex('/',d,1) + 1 ) - charindex('/',d,1) -1 ),2) +
            right('0' + left(d,charindex('/',d,1)-1),2)
            ) correctDate
From mytable
于 2013-02-07T17:00:52.077 に答える