Обновите столбцы, когда значение является числовым в TSQL - PullRequest
0 голосов
/ 26 мая 2010

Я хочу нормализовать поля даты из старого плохо спроектированного дампа базы данных. Теперь мне нужно обновить каждую строку, где поле даты содержит только год.

update table set date = '01.01.' + date
where date like '____' and isnumeric(date) = 1 and date >= 1950

Но это не сработает, потому что sql не выполняет оценку логических выражений при коротком замыкании. Таким образом я получаю сообщение об ошибке «ошибка преобразования nvarchar '01 .07.1989 'в int»

Есть ли способ обойти это? Столбец также содержит строки длиной 4, которые не являются числами (????, 5/96, 70/8 и т. Д.). Таблица только имеет 60000 строк

Ответы [ 3 ]

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

Вы всегда можете сделать подзапрос

update table set date = '01.01.' + date
where id in(

   select id from table
   where date like '____' and isnumeric(date)

)
and convert(int, date) >= 1950
1 голос
/ 26 мая 2010

Как насчет того, чтобы заключить 1950 в одинарные кавычки?

Я провел быстрый тест:

DECLARE @Table TABLE (Date NVARCHAR(20))
INSERT @Table 
SELECT '2010' 
UNION ALL 
SELECT '2009' 
UNION ALL 
SELECT '01.07.1989' 
UNION ALL 
SELECT '1951'
UNION ALL
SELECT '1940'
UNION ALL
SELECT 'Some Text'

UPDATE @Table
SET Date = '01.01.' + date
WHERE date LIKE '____' AND ISNUMERIC(date) = 1 AND date>='1950'

SELECT * FROM @Table
0 голосов
/ 26 мая 2010

Может быть, добавить новое поле для хранения фактической даты и времени. Значение:

alter table [Table] add [RealDate] datetime;
update [Table] set [RealDate] = cast([Date] as datetime) where isdate([Date]) = 1
...