2010-05-06 136 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