2017-04-12 125 views
1

我試圖從BIGINT直接更改列數據類型最新型的示值誤差:更改列的數據類型

"Unable to modify table. Explicit conversion from data type bigint to date is not allowed."

即使我試圖用改變再次查詢必須改變這個錯誤

"Operand type clash: bigint is incompatible with date".

請幫助..

我試了一下:

ALTER TABLE emp_det1 ALTER COLUMN dob date 
+2

改變方式?你是指CAST還是ALTER TABLE?告訴我們你做了什麼。 – jarlh

+0

@jarlh alter table這裏是我的查詢: ALTER TABLE emp_det1 ALTER COLUMN dob date; –

+3

添加新的日期列。做更新複製並將現有的bigint日期轉換到新列。完成後,放棄舊列。也許重命名新列。 (在執行此操作之前檢查依賴關係!外鍵,索引,觸發器,視圖等) – jarlh

回答

0

它的錯誤,因爲你的bigint列中的數據不能顯式轉換爲日期時間。下面的代碼測試了這個理論,並且會失敗。沒有數據插入就再試一次,它會起作用。建議創建新的日期時間列並在轉換時傳輸數據的帖子評論是您的最佳選擇......假設您的bigint值確實可以轉換爲日期時間。

create table #test (MyCol bigint) 

insert into #test (MyCol) values(3123456789) 

alter table #test 
alter column MyCol datetime 
0

由於錯誤消息指示您無法將bigint轉換爲日期。

你需要做一些邏輯,將其轉化:

例如2016年4月10日將被存儲爲4102016,其中爲2016年12月10日將是12102016.還有一個字符的區別。

我的建議是:

  • 備份數據,無論是我的複製表或進行備份。
  • 創建一個包含pk和dob的臨時表。
  • 將一個varchar列添加到臨時表並使用dobs填充它。 (chardate)
  • 將原始表中的所有dobs設置爲null。
  • 更改列上的數據類型爲止。
  • 使用正確的邏輯在臨時表中對原始表運行更新以轉換日期。

這個邏輯會有所不同取決於你的日期格式,但爲美國(MM/DD/YYYY)將是這個樣子:

update emp_det1 
set dob = case 
      when len(chardate) = 8 
       then convert(date,left(chardate,2)+'/'+substring(chardate,3,2)+'/'+right(chardate,4),101) 
      when len(chardate) = 7 
       then convert(date,'0'+left(chardate,1)+'/'+substring(chardate,2,2)+'/'+right(chardate,4),101) 
from emp_det1 
    join #conv as conv 
     on emp_det1.pk = conv.pk 

您可以更改皈依try_converts發現不合格的日期,我還建議在更新之前運行一些選擇語句,以確保數據在提交前看起來正確。