2017-04-12 6 views
1

私は直接日付型にその示すエラーをbigint型から列のデータ型を変更しようとしています:変更bigint型から列のデータ型を

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

も、私は再び得たALTERクエリを使用して変更しようとしました私が試した何

"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

新しい日付列を追加します。 UPDATEを実行して、既存のbigintの日付をコピーして新しい列に変換します。終了したら、古い列を削除します。おそらく、新しい列の名前を変更します。 (外部キー、インデックス、トリガー、ビューなどの前に依存関係をチェックする) – jarlh

答えて

0

bigint列に明示的にdatetimeに変換できないデータが含まれているため、エラーです。下のコードは理論をテストし、失敗します。データを挿入せずにもう一度試してみてください。うまくいきます。新しいdatetime列を作成し、変換中にデータを転送することを示唆する投稿コメントは、bigint値が実際にdatetimeに変換できると仮定すると、最良の選択肢です。

create table #test (MyCol bigint) 

insert into #test (MyCol) values(3123456789) 

alter table #test 
alter column MyCol datetime 
0

エラーメッセージは、bigintを日付に変換できないことを示しています。

あなたはそれを変換するためにいくつかのロジックを実行する必要があります:10として2016年12月には12102016.文字差があるだろうどこたとえば2016年4月10日のために

は4102016として格納されます。

私の推薦は次のようになります。

  • バックアップデータ、どちらか私のテーブルをコピーするか、バックアップを取って。
  • pkとdobを含む一時テーブルを作成します。
  • 一時テーブルにvarcharカラムを追加し、それにdobsを設定します。
  • すべてのdobsを元のテーブルのnullに設定します。
  • 列のデータ型をdateに変更します。
  • 日付を変換する正しいロジックを使用して、一時テーブルから元のテーブルの更新を実行します。

ロジックはあなたのDATEFORMATではなく、米国(YYYY/MM/DD)は次のようになりますためによって異なりだろう:

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に改宗を変更することができ、コミットする前にデータが正しいかどうかを確認するために、更新前にselect文を実行することをお勧めします。

関連する問題