我有一个ddmmmyyyy:hh:mm:ss.nnnnnn
列,它存储为varchar(25)
。我需要将它作为日期时间保存在同一列中。我尝试过使用
update tablename
set columnname = (SUBSTRING(columnname,1,2) + '-' + SUBSTRING(columnname,3,3) + '-' +
SUBSTRING(columnname,6,4) + ' ' + SUBSTRING(columnname,11,8));
然后
alter table tablename
alter columnname datetime;
但稍后会显示错误
Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
如何更改上述查询的任何其他意见或任何修改。请帮忙。谢谢。
答案 0 :(得分:1)
根据您提供的字符串格式,您应该使用datetime2
数据类型
你的字符串格式几乎是正确的,年后只有1个冒号。
如果您修复了该问题,可以直接将varchar
字段转换为datetime2
。例如,首先您可以通过运行以下查询
UPDATE myTable
SET targetColumn = STUFF ( targetColumn , 10, 1, ' ')
-- ddmmmyyyy:hh:mm:ss.nnnnnn
-- \
-- this colon is extra which is at 10th position
在此之后,您可以直接ALTER
您的表格,并将数据类型更改为datetime2
。
重要提示:所有行中的数据必须包含有效日期
这是一个测试,显示如何转换
CREATE TABLE testTable(testCol varchar(25));
INSERT INTO testTable(testCol)
VALUES('03Jan2014 18:33:39.999999');
ALTER TABLE testTable ALTER COLUMN testCol datetime2;
SELECT *
FROM testTable
DROP TABLE testTable;
答案 1 :(得分:0)
添加新列
alter table t
add n datetime
更新新列
update t
set n = datetimefromparts(
cast(substring(o,6,4) as int),
case substring(o,3,3)
when 'jan' then 1
...
when 'dec' then 12
end,
cast(substring(o,1,2) as int),
cast(substring(o,11,2) as int),
cast(substring(o,14,2) as int),
cast(substring(o,17,2) as int),
cast(substring(o,20,6) as int)
)
如果您需要删除旧列
alter table t
drop column o