2010-06-01 81 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