1

何年も前に MSSQL 6.5 から MSSQL 2000 への変換が行われましたが、ちょうど今週、その変換で日時列の変換に失敗したことに気付きました。それを修正することが今の私の仕事であり、正確であることがわかっている情報の一部をどのように保存できるか頭を悩ませてきました. これは、修正する必要があるテーブルの 1 つの構造です。

DateTimeField1         DateTimeField2         DateTimeField3
01/01/1900 5:50:00 PM  01/01/1900 5:52:00 PM  15/02/2005 12:00:00 AM

これは、破損した多くのレコードの 1 つのサンプルです。残念ながら、変換前のバックアップにアクセスできません。ご覧のとおり、日付部分は DateTime フィールドのデフォルト値であり、修正が必要な部分です。次の選択があります。これにより、修正する必要のある行が得られます。

SELECT DateTimeField1, DateTimeField2, DateTimeField3
FROM Table1
WHERE (DateTimeField1 < '20000101') OR (DateTimeField2 < '20000101')

ここで、select の結果として 60 個のレコードがあるとします。DateTimeField3 DATE 部分のみに基づいてこれらのレコードを更新する必要があります。上記のサンプルは次のようになります。

DateTimeField1         DateTimeField2         DateTimeField3
15/02/2005 5:50:00 PM  15/02/2005 5:52:00 PM  15/02/2005 12:00:00 AM

これを達成する方法について何か考えはありますか?

4

6 に答える 6

1

1 つのフィールドが常に 1900-01-01 であるが正しい時刻であり、もう 1 つのフィールドが 12:00:00 AM であるが正しい日付である場合、それらを一緒に追加することができます。

UPDATE Test
SET
  DateTimeField1 = DateTimeField1 + DateTimeField3,
  DateTimeField2 = DateTimeField2 + DateTimeField3
WHERE (DateTimeField1 < '20000101') OR (DateTimeField2 < '20000101')

この SQL Fiddleを参照してください。

1900-01-01 は「ゼロ」の日付なので、それを別の日付に追加すると、同じ値が得られます。午前 12:00:00 は「ゼロ」時間です。

DateTimeField1 の日付が正しく、DateTimeField2 の日付が正しくない場合は、これを 2 つの個別のクエリとして実行することをお勧めします。

于 2013-06-04T12:13:13.130 に答える
0

次のクエリを使用します。

SELECT DateTimeField1 = 
    convert(datetime,convert(int,convert(float,t.DateTimeField3)) 
    + convert(float,t.DateTimeField1)),
       DateTimeField2 = 
    convert(datetime,convert(int,convert(float,t.DateTimeField3)) 
    + convert(float,t.DateTimeField2)),
FROM Table1 t
WHERE (DateTimeField1 < '20000101') OR (DateTimeField2 < '20000101')

SQL Serverとして保存datetimeされfloatます。右側は時刻、左側は日付です。このクエリは、間違った日時の左側を正しい日時の左側に置き換えます

于 2013-06-04T12:13:14.847 に答える
0

このようなことを試してください。MSSQL 2000で動作するはずです

UPDATE tab SET DateTimeField1 = 
ltrim(str(datepart(year, DateTimeField3))) + '-' + 
ltrim(str(datepart(month, DateTimeField3))) + '-' + 
ltrim(str(datepart(day, DateTimeField3))) + ' ' +
ltrim(str(datepart(hour, DateTimeField1)))  + ':' + 
ltrim(str(datepart(minute, DateTimeField1))) + ':' + 
ltrim(str(datepart(second, DateTimeField1))) + '.' + 
ltrim(str(datepart(millisecond, DateTimeField1))) ,
DateTimeField2 = ltrim(str(datepart(year, DateTimeField3))) + '-' + 
ltrim(str(datepart(month, DateTimeField3))) + '-' + 
ltrim(str(datepart(day, DateTimeField3))) + ' ' +
ltrim(str(datepart(hour, DateTimeField2)))  + ':' + 
ltrim(str(datepart(minute, DateTimeField2))) + ':' + 
ltrim(str(datepart(second, DateTimeField2))) + '.' + 
ltrim(str(datepart(millisecond, DateTimeField2)))
WHERE (DateTimeField1 < '20000101') OR (DateTimeField2 < '20000101')
于 2013-06-04T12:32:14.010 に答える