当sql中的值为numeric时更新列

时间:2010-05-26 09:59:47

标签: sql sql-server string datetime sql-update

我想从旧的设计糟糕的数据库转储中规范化日期字段。我现在需要更新每一行,其中datefield只包含年份。

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/9670/8等。)表有60000行

3 个答案:

答案 0 :(得分:1)

如何用单引号括起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

答案 1 :(得分:1)

你总是可以做一个子查询

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

答案 2 :(得分:0)

可能添加一个新字段来存储实际的日期时间值:

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