SQL将Nvarchar(255)转换为DateTime问题

时间:2010-05-06 18:35:46

标签: sql sql-server sql-server-2008 datetime

我正在使用SQL Server 2008。

我有2个表:表1和表2.

表1有一列名为:OldDate,它是nvarchar(255),null
表2有1列名为:NewDate,它是datetime,而不是null

表1中的示例数据:

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

当我尝试CAST(OldDate as datetime)

我收到此错误:

  

算术溢出错误转换   表达式到数据类型datetime。

我需要将OldDate插入NewDate,没有错误。我不能跳过一些行。

2 个答案:

答案 0 :(得分: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

输出:

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 :(得分:1)

您的数据似乎不正确(或拼写错误)。

部分日期采用英国/法国标准dd/mm/yyyy(参见代码103),部分采用美国标准mm / dd / yyyy(代码101)。

对于第一种情况,您可以尝试CONVERT(datetime, [OldDate], 103)

表示第二个CONVERT(datetime, [OldDate], 101)