更改迄今为止的数字列

时间:2018-05-30 08:59:42

标签: sql sql-server tsql

我有一个表,其中一列是DOB,目前属于Numeric(7,0)类型。 该列的样本值如下

DOB
0
1050418
1050412
1060303

我正在转换SQL中的列,如下所示

SELECT Convert(Date,Convert(varchar,19000000+DOB),101) as DOB_Date From Test where DOB<>0

我的目标是将此列转换为日期日期类型。

执行SQL时

ALTER TABLE TEST ALTER COLUMN DOB DATE NULL;

给出错误

  

操作数类型冲突:数字与日期不兼容。

2 个答案:

答案 0 :(得分:5)

两种选择,总体上差别不大。

1)将列数据类型更改为文本形式(例如varchar(10))。然后将文本值就地转换为可以明确转换为日期的表单(例如YYYYMMDD没有分隔符),然后执行第二次数据类型转换。

2)创建一个新的日期类型列。使用现有表达式执行更新以设置新值。删除旧列并(如有必要)重命名新列以匹配旧列名。

答案 1 :(得分:0)

您可以向表中添加计算列以进行转换:

alter table t
    add dob_date as (case when dob > 0 then cast(cast(dob + 19000000 as varchar(10)) as date) end);

如果您想这样做,那么您可以分多步完成:

alter table t alter dob varchar(8);

update t
    set dob = (case when dob <> '0' then 19000000 + dob end);

alter table t alter dob date;

这是一个类型转换的日志,但它应该有效。