我想从旧的设计糟糕的数据库转储中规范化日期字段。我现在需要更新每一行,其中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/96
,70/8
等。)表仅有60000行
答案 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