SQL Преобразовать NVARCHAR (255) к задаче DateTime - PullRequest
0 голосов
/ 06 мая 2010

Я использую SQL Server 2008.

У меня есть 2 таблицы: таблица 1 и таблица 2.

Таблица 1 имеет 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 как datetime)

Я получаю эту ошибку:

Преобразование арифметической ошибки переполнения выражение для типа данных datetime.

Мне нужно вставить OldDate в NewDate без ошибок. Я не могу пропустить несколько строк.

Ответы [ 2 ]

3 голосов
/ 06 мая 2010

попробуйте использовать

CONVERT(datetime,OldDate ,103)

"103" сообщает конвертеру, что формат dd/mm/yyyy

EDIT

здесь хорошо, как со многими примерами: 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)

Я использовал «01.01.1900», потому что у вас NewDate как NOT NULL.

1 голос
/ 06 мая 2010

Кажется, у вас неверные данные (или опечатка).

Некоторые даты указаны в британском / французском стандарте dd/mm/yyyy (см. Код 103 ), а некоторые в США - стандарт мм / дд / гггг (код 101).

Для первого случая вы можете попробовать CONVERT(datetime, [OldDate], 103),

для второго CONVERT(datetime, [OldDate], 101)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...