SQL将Nvarchar(255)转换为DateTime问题 [英] SQL Convert Nvarchar(255) to DateTime problem

查看:521
本文介绍了SQL将Nvarchar(255)转换为DateTime问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用SQL Server 2008。



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



表1有一列名为:OldDate,它是nvarchar(255),null

表2有一列名为NewDate,即datetime,not null



表1中的示例数据:

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

当我尝试CAST(OldDate as datetime)



我得到这个错误:



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


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

解决方案

尝试使用

  CONVERT(datetime,OldDate,103)

103告诉转换器格式是 dd / mm / yyyy



编辑 p>

这里有很多很好的例子: http ://www.sqlusa.com/bestpractices/datetimeconversion/



你似乎有m / d / y以及d / m / y数据这是关于你最好的做法:

  DECLARE @ Table1表(PK int,OldDate nvarchar(255)null)
DECLARE @ Table2表(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

更新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行受影响)

我用'1/1 / 1900',因为NewDate为NOT NULL。


I'm using SQL server 2008.

I have 2 Tables: Table 1 and Table 2.

Table 1 has 1 column called: OldDate which is nvarchar(255), null
Table 2 has 1 column called: NewDate which is datetime, not null

Example data in Table 1:

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

When i try CAST(OldDate as datetime)

I get this error:

Arithmetic overflow error converting expression to data type datetime.

I need to insert OldDate into NewDate with no errors. I can't skip some rows.

解决方案

try using

CONVERT(datetime,OldDate ,103)

the "103" tells the converter that the format is dd/mm/yyyy

EDIT

here is a good like with many examples: http://www.sqlusa.com/bestpractices/datetimeconversion/

You seem to have m/d/y as well as d/m/y data, this is about the best you can do:

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)

I used '1/1/1900' because you have NewDate as NOT NULL.

这篇关于SQL将Nvarchar(255)转换为DateTime问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆