2010-06-01 67 views
1

我有我得到一个错误,当我尝试改变日期栏:演员阵容或转换?

Arithmetic overflow error for type varchar, value = 20100601.000000. 

我想它从浮去的20100601.

由于阿尔特不工作的日期时间格式,如何使用强制转换或转换来更改表中每个条目的数据类型?

+1

什么是当前的数据类型,以取代旧列,你想要什么? – 2010-06-01 19:48:45

+0

现在它是“浮动”,我喜欢它是'20100601'的数据类型。你知道吗? – Daniel 2010-06-01 19:53:36

+0

2010年6月1日06:00有没有像20100601.250000这样的值? – gbn 2010-06-01 20:08:18

回答

2
UPDATE table_name 
SET new_date_column=CAST(CAST(CAST(old_date_column AS INT) AS VARCHAR) AS DATETIME) 

这将更新新列

+0

非常感谢,这正是我正在寻找的。现在运行.. – Daniel 2010-06-01 20:14:47

+0

没问题。很高兴我能帮上忙。请标记为答案? 谢谢, 大风 – geshafer 2010-06-01 20:16:32

+0

这实际上给了我一个'Jun 1 2'的日期时间格式 我们怎样才能让它显示20100601? – Daniel 2010-06-01 20:16:35

3

“20100601.000000”是指20万元,10万,后601天01一月1900

“20100601”作为一个字符串是2010年01月

我会使用从float转换为日期时间时这是100%肯定的转换

SELECT CAST(CAST(CAST(20100601.000000 AS int) AS char(8)) AS datetime) 
+0

好的,但是这并不能回答我的问题,即如何转换或转换列中的每个值。 – Daniel 2010-06-01 19:55:54

+0

我现在明白了。我可以将此代码应用于整个列吗? – Daniel 2010-06-01 20:01:31

+1

这是否会导致任何时间组件丢失(如果有)? – 2010-06-01 20:05:56

2

我敢肯定,必须有一个更好的办法的......

ALTER TABLE dbo.YourTable ADD 
    NewColumn datetime NULL 

UPDATE [YourTable] 
    SET [NewColumn] = 
     CAST(CAST(CAST(ROUND(YourOriginalColumn,0) as INT) AS char(8)) AS DATETIME) 

那么,如果这个想法是你必须理智后检查的事情,做了备份等

ALTER TABLE dbo.Cars 
    DROP COLUMN YourOriginalColumn 

EXECUTE sp_rename N'dbo.YourTable.NewColumn', N'YourOriginalColumn', 'COLUMN' 
+1

不可以。这很清楚需要什么演员。我想出了相同的... – gbn 2010-06-01 19:57:14

+0

如何为列中的每个值执行此操作?超过1,000,000行。 – Daniel 2010-06-01 19:57:33

+1

我想添加一个新的列到正确的数据类型的表更新到新值,理智检查它,然后删除旧的列,并重命名新的,如果你的RDBMS允许这一点。实际上您使用的是哪种RDBMS--我已经使用了ROUND,它可能不被支持或实际需要,但是当您以浮点形式存储时,会让我感觉更安全一些。 – 2010-06-01 20:01:29