2010-05-06 138 views
0

我使用SQL服務器2008SQL轉換NVARCHAR(255)爲DateTime問題

我有2個表:表1和表2

表1具有1列稱爲:OldDate這是nvarchar的(255),空
表2具有1列稱爲:NewDate這是日期時間,不爲空

實施例數據在表1中:

26/07/03 
NULL 
NULL 
23/07/2003 
7/26/2003 
NULL 
28/07/03 

當我嘗試CAST(OldDate爲DATETIME)

我得到這個錯誤:

Arithmetic overflow error converting expression to data type datetime.

我需要插入OldDate到NewDate沒有任何錯誤。我不能跳過一些行。

+0

的示例數據應該是: 26/07/03 NULL NULL 23/07/2003 7/26/2003 NULL 28/07/03 – steven 2010-05-06 18:38:16

回答

3

嘗試使用

CONVERT(datetime,OldDate ,103) 

的 「103」 告訴格式是dd/mm/yyyy

編輯

這裏就像很多例子了良好的轉換器:http://www.sqlusa.com/bestpractices/datetimeconversion/

你似乎有m/d/y以及d/m/y數據,這是你可以做的最好的:

DECLARE @Table1 table (PK int, OldDate nvarchar(255) null) 
DECLARE @Table2 table (PK int, NewDate datetime not null) 
INSERT @Table1 VALUES (1,'26/07/03') 
INSERT @Table1 VALUES (2,null) 
INSERT @Table1 VALUES (3,null) 
INSERT @Table1 VALUES (4,'23/07/2003') 
INSERT @Table1 VALUES (5,'7/26/2003') 
INSERT @Table1 VALUES (6,null) 
INSERT @Table1 VALUES (7,'28/07/03') 

SET DATEFORMAT dmy 

INSERT INTO @Table2 
     (PK, NewDate) 
    SELECT 
     PK, 
     CASE 
      WHEN ISDATE(OldDate)=1 THEN OldDate 
      ELSE '1/1/1900' 
     END 
     FROM @Table1 

SET DATEFORMAT mdy 

UPDATE t2 
    SET NewDate=OldDate 
    FROM @Table2   t2 
     INNER JOIN @Table1 t1 ON t2.PK=t1.PK 
    WHERE t2.NewDate='1/1/1900' AND ISDATE(OldDate)=1 

SELECT * FROM @Table2 

OUTPUT:

PK   NewDate 
----------- ----------------------- 
1   2003-07-26 00:00:00.000 
2   1900-01-01 00:00:00.000 
3   1900-01-01 00:00:00.000 
4   2003-07-23 00:00:00.000 
5   2003-07-26 00:00:00.000 
6   1900-01-01 00:00:00.000 
7   2003-07-28 00:00:00.000 

(7 row(s) affected) 

我用 '1/1/1900',因爲你有NewDate爲NOT NULL。

1

看來你有不正確的數據(或錯字)。

部分日期採用英國/法國標準dd/mm/yyyy(見代碼103),部分日期採用美國標準mm/dd/yyyy(代碼101)。

對於您可以嘗試CONVERT(datetime, [OldDate], 103)第一種情況下,

第二CONVERT(datetime, [OldDate], 101)

+1

你媽你也有類似''或2010年2月30日的數據或ASAP,這些日期也不是有效日期,需要清理。使用isdate函數查找那些不可轉換的日期。也千萬不要再次在varchar字段中存儲日期! – HLGEM 2010-05-06 18:58:33