0

とがvarcharsとして2つの別々の属性に格納されているデータベースがありますCREATEDATE。これら2つを1つの属性CREATETIMEに結合しようとしています。smalldatetime

次の変換を実行すると、エラーが発生します。

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

UPDATE UsersTemp
SET Created =   CONVERT(datetime, CAST(CONVERT(date, CreateDateIMF, 102)AS varchar(50)) 
            + ' ' +
            CASE WHEN LEN(CreateTime) = 6 THEN 
                 Left(CreateTime, 2) + ':' + SUBSTRING(CreateTime, 2, 2)
            ELSE 
                 Left(CreateTime, 1) + ':' + SUBSTRING(CreateTime, 1, 2)
            END
            + ':' + Right(CreateTime, 2), 120)

(はい、これは厄介なSQLですが、このデータをより適切に使用できる方法で取得するのは一時的なものです)

セット全体を操作するときにさまざまなことを試しましたが、うまく機能しないようです。

上記のパラメータをで試してみるとSELECT、日付は正常に機能するため、時間フィールドに問題がありますが、修正方法がわかりません。

元のデータの例:

CREATEDATEIMF
 20120220
 20040415
 20040415
 20040415
 20040415
 20040415
 20040415
 20040415
 20040415
 20050510

CREATETIME
 160401
 142304
 142304
 142304
 142304
 142304
 142304
 142304
 142304
 44427

時間はHMMSSであることを確認しました。(短い時間には先行ゼロがないことに注意してください)

このデータは、古いCOBOLプログラムからのダンプです。

4

2 に答える 2

5
DECLARE @x TABLE (CREATEDATE VARCHAR(32), CREATETIME VARCHAR(32));

INSERT @x VALUES
('20120101','142304'),
('20120101','44427');

SELECT CONVERT(DATETIME, 
  CREATEDATE + ' ' + STUFF(STUFF(RIGHT('00' 
  + CREATETIME, 6), 5, 0, ':'), 3, 0, ':'))
FROM @x;

だからあなたの場合、

UPDATE dbo.UsersTemp SET Created = CONVERT(DATETIME, 
  CREATEDATE + ' ' + STUFF(STUFF(RIGHT('000000' 
  + CREATETIME, 6), 5, 0, ':'), 3, 0, ':'));

ここで、間違ったデータ型を使用して日付/時刻データを格納することを選択したため、そこにあるすべての値が実際に適切に変換されるという保証はありません。

于 2013-02-20T19:19:45.270 に答える
1
SELECT RIGHT('000000' + CAST(createtime AS VARCHAR(6)), 6) paddedCreateTime
FROM yourTable

44427 は 044427 のように見えるはずですが、これが問題の原因かどうかはわかりません

于 2013-02-20T19:20:56.190 に答える