代码之家  ›  专栏  ›  技术社区  ›  knittl

当tsql中的值为数字时更新列

  •  0
  • knittl  · 技术社区  · 14 年前

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

    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 回复  |  直到 12 年前
        1
  •  1
  •   David Hedlund    14 年前

    您可以始终执行子查询

    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
  •  1
  •   AdaTheDev    14 年前

    用单引号括上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
    
        3
  •  0
  •   My Other Me    14 年前

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

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