2016-09-22 1 views
0

bigintデータ型とdatetimeデータ型で構成される複合キーまたは一意のインデックスを使用する必要があります。しかし、私はdatetimeの秒の要素が最も近い分に丸められ、データセットをインポートしようとすると重複したキー違反が発生することに気付きました。複合キーまたは固有インデックスを作成するためにbigintフィールドとともに使用すると、datetimeフィールドの精度が変わるのですか?

データセットは基本的にトランザクションデータなので、bigintフィールドに格納されているIDが繰り返されるため、一意のキーにdatetimeフィールドを含める必要があります。

例を与えることを、次の2つの行が「重複するキー行」というエラーが発生:

IDフィールド(BIGINT)を| ActionDate(datetime)
--------------------- | ---------------------- ----
1050000284002 | 2016-01-08 15:51:24.000
1050000284002 | 2016年1月8日15:50:35.000

値は明らかに異なっている(と、データベースに正しく保存されている)が、エラーが表示さ:

The duplicate key value is (1050000284002, Jan 8 2016 3:51PM). 

(それは私が最初に複合体を作成したことを追加する価値がありますキーと一意のインデックスとそれを置き換えるので、持っている、上記で概説したエラーが代わりにインデックスを作成した)

私の質問は以下の通りです。

  1. は、私はだから四捨五入されている私の日時フィールドですキー/インデックスの整数を使用していますか?
  2. 日時フィールドの時間コンポーネントの精度を失うもう一つの理由はありますか?
  3. 例でキー違反が発生しないように問題を修正するにはどうすればよいですか?私はこれを行う場合は
+0

これはあなたを欺く入力です。日時フォーマットの定義は、BOLにはっきりと記載されています。より高い精度が必要な場合は、Datetime2を使用します。 – ajeh

+0

コメントありがとう、ajeh。私はBOLが何であるか分からない。私の編集(例を含む)が与えられても、あなたは私のデータ型が間違っているという意見はまだありますか? –

+0

これ以上のSQL開発を行う前に、Books OnlineまたはBOLを理解しておく必要があります。 – ajeh

答えて

1

あなたが列A + Bではなく定型1(インデックス(列A、Bを上のインデックス)形式のインデックスを使用している場合)、そうでなければ、ある列のデータ型は他の列の内容に影響を与えません。

  • 日時列の実際のデータ型:

    はあなたの説明に基づいて、私は次のことを確認したいです。それは日時ですか? (日時は一番近い333秒に丸められますが、ここでは問題はありません)

  • インデックスの実際の定義です。定義されていると定義されていますか?おそらく、日付(DateTimeColumn)でインデックスを作成していますか?
  • 実際のデータが格納されています。おそらく秒を切り捨てるデータがテーブルにロードされていますか?あなたの編集に基づいて

さらに提案:

あなたは明確にインポートされたデータは、ユニークなdatetime値が含まれている、まだSQLは、独自の日付値を特定されていない場合は、何かが、データのインポートプロセスと次第です。

テーブルにのデータをロードしてみてください。インデックスはではありません。それはロードされますか?ソースデータとミリ秒が一致していますか?次に、データがロードされた状態で、索引(主キー、一意制約など)を作成します。これは失敗しますか?重複データはどこから来ていますか?要するに、データを読み込んでプロセスを読み込んで、何が落ちているのかを見てみましょう。

+0

あなたの返信ありがとう、フィリップ。私は詳細を提供するために私の質問を編集しました。私は自分のデータが問題だとは思わない。私は私のインデックスを詳しく見ていきます。 –

+0

私の答えに追加 –

+0

あなたのコメントをありがとうございました。私は、インポートプロセスがどこかで重複行を作成していると思います(私は複数の他のテーブルにいくつかの結合を使用していますので、インポートプロセスだと思います)。 –

0

declare @i bigint 
set @i=25 
select @i+getdate() 
select cast (@i+getdate() as int) 

を私が取得: 2016年10月17日09:47:05.753

42658 

お知らせ最初の結果が日付プラス25日間です。したがって、日付の整数部分には降下がありません(そうでなければ、日付の真夜中になります...)。

第2の選択が小数点の後にすべてをドロップし....

関連する問題