2013-02-20 61 views
0

我有一個數據庫,其中CREATEDATECREATETIME作爲varchars存儲在2個獨立的屬性中。我試圖將這2個合併爲一個smalldatetime屬性。將2 varchar屬性轉換爲datetime時出錯

當我運行下面的轉換,我收到錯誤:

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。 (注意短時間內沒有前導0)

這個數據是從舊的COBOL程序轉儲的。

+0

你確定它不只是SMALLDATETIME不支持秒? (請參閱http://msdn.microsoft.com/en-gb/library/ms182418.aspx) – chrisb 2013-02-20 19:20:28

+2

@chrisb不,秒數被截斷,它們不阻止轉換。 – 2013-02-20 19:23:13

回答

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, ':')); 

現在,既然你選擇了存儲日期/使用錯誤數據輸入的實時數據,也不能保證所有的值你有實際上會進行適當的轉換。

+0

+1給出答案*和*關於適當數據類型的警告。 – swasheck 2013-02-20 19:23:15

+0

這工作。我沒有意識到'smalldatetime'截斷了秒,謝謝。但是,無論如何,在這種情況下,我不在乎秒。 – mawburn 2013-02-20 19:35:18

1
SELECT RIGHT('000000' + CAST(createtime AS VARCHAR(6)), 6) paddedCreateTime 
FROM yourTable 

應使44427的樣子044427,但我不知道這是你的問題是

+0

那麼,請嘗試'選擇CONVERT(SMALLDATETIME,'044427');' - 這個答案不完整。 – 2013-02-20 19:25:42