DATETIMEデータ型のミリ秒丸め現象

公開日: : 最終更新日:2013/12/10 SQL Server , ,

DATETIMEデータ型のミリ秒には丸めがあります

SQLServerのDATETIMEデータ型のユニークキーを設定し、
システム時間を挿入してあるテーブルを管理していたのですが、
どうもDATETIMEデータ型のユニークキーで更新に行くと
「更新レコードがない」という現象に見舞われました。

処理としてはレコード挿入時のシステム時間を取得して、
そのシステム時間をキー情報にレコードを挿入し、その後
その取得したシステム時間にレコード更新しにいくというもの。

基本的には「挿入エラー」が無い限りレコードは更新対象レコードは
1件あるはず。
複数の端末から同時挿入以外は「挿入エラー」はまずない。
しかも使用するユーザー数が少ないため、まず衝突することは
ないはず。

しかしながら「更新レコードがない」という現象が日に何度か発生。

挿入した日付と日付が挿入されていることが判明

試しにテスト用のテーブルを作成しデータを挿入してみます。

で、挿入したデータの「no=1」のデータの取得を目指して
ミリ秒が「990」の行を選択してみます。

結果は

2件取得。

noが「0」と「1」になっているので、どうやら
「990」と「991」は同じになっている模様。

試しに「991」で検索してみると

2件取得。
結果は同じなので「990」=「991」と扱われているようです。

「992」で検索すると

結果は

と3件ヒット。

「992」で検索すると

結果は

と結果は同じ3件。

どうやらミリ秒は丸められているようです。

ミリ秒の丸めについて調べてみると

datetime データ型の時刻範囲が 00:00:00 ~ 23:59:59.997 であり、
ミリ秒の精度が .000、.003、.007 であるためです。
.000、.003、.007 以外の値は .000、.003、.007 に丸められます。


という記述をつけた。

実験してみると

にそれぞれ丸めが発生する。

結果、挿入したレコードの日付と更新しようとした日付でミリ秒単位で
ずれが発生し「更新レコードがない」という現象が発生することが判明。

ミリ秒単位で丸めが発生しないようにするには

このようなミリ秒単位で丸めが発生しないようにするには
「datetime」型をやめ「datetime2」型にすることで解決する。

実行結果は

でミリ秒の単位での丸めは発生していない。

本来はユニークキーを独自に生成するにはUNIQUEIDENTIFIER型

本来はこのような場合は同時挿入の衝突を避けて、ユニークキーを
独自に生成するにはUNIQUEIDENTIFIER型を利用し、
挿入する値をNEWID()で取得して挿入するべきである。

そうすればこのような丸めの問題にぶち当たることもなく、
トラブルを未然に防げる。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • 14 follow us in feedly

関連記事

keybord_black

春分の日と秋分の日をSQLで求める計算式

春分の日と秋分の日は毎年違う 春分の日と秋分の日は 祝日としての春分の日・秋分の日は、 前

記事を読む

no-img

SQL Server-SQLでテーブル仕様書になるものネタを取ってみる

SQLでテーブル仕様書になるものネタを取ってみます。 これを実行すると [crayo

記事を読む

a0001_013635

指定した列名がどのテーブルで使用されているか検索するSQL

指定した列名を利用しているテーブルを検索 SQLServerで指定した列名がどのテーブルで使用され

記事を読む

no-img

SQLServerでテーブルの存在を確認する

データベース内のテーブル情報をから存在を確認する プログラムで動的にテーブルを作成したりする場合に

記事を読む

calender

指定された月の日数をSQLで求める

指定された月の日数をSQLで求める SQLServerには該当月の日数を求める関数がないので

記事を読む

no-img

ISNULL()関数を使ってSQLでIF文を使わずに条件を分岐する

ISNULLをIF文の代わりに使ってみる SQLでIFを書けばWHERE句の内容を変えて検索できま

記事を読む

no-img

システム日付を取得する

様々な関数でコンピューターのシステム日付を取得する SQLServerのインスタンスを実行している

記事を読む

no-img

SELECTした結果をランダムに並び変える

SQLでSELECTした結果をランダムに並び変えて表示する SQLServerでSELECTした結

記事を読む

no-img

SQLServerではTRIM関数がありません

SQLServerでは空白を取り除くTRIM関数がない SQLServerではOracleやMyS

記事を読む

no-img

SQLで棒グラフの簡易版を出力する

SQLで棒グラフの簡易版出力 SQLで棒グラフの簡易版を出力してみます。 1.テーブルの作成

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

no-img
SQLServerのダミーテーブル

SQLServerでダミーテーブルを使う データベースサーバから

no-img
SQLServerでTrue,FalseのようなBoolean型をあつかう

SQLServerでBoolean型を扱う SQLServerに

no-img
CREATE TABLE,ALTER TABLEでテーブルのプライマリーキー(PK)を作成する

SQL ServerでSQLを使用してプライマリーキー(PK)を作成し

no-img
SQLで文字列を3分割する

SQLで文字列を3分割する どうしてもSQLServerで特定の

no-img
GROUP BYとHAVINGで最新日付データを取得する

GROUP BYとHAVINGで最新日付データを取得する 社員マスタ

→もっと見る



PAGE TOP ↑