2009-05-27 5 views
1

データベースに浮動小数点データとして日時を格納すると、何ができますか?私はそれを行うための非常に良い理由がありますので、それについて文句を言ってはいけません:データベースに浮動小数点データとして日時を格納すると、何ができますか?

編集:浮動小数点型の列にconvert(float、@thedate)を格納することを考えていました。

+1

あなたの理由は何ですか?私は初心者にとって、精度に問題があると思います。 –

+1

どうやって保管していますか?いくつかの時代からの経過時間のカウントとして?あるいは、ある種のリテラル表現ですか? –

答えて

7

あなたは何を噛むことができますか?最初の浮動小数点は正確なデータ型ではないため、精度を必要とするものには決して使用しないでください。次に、floatは不正な日付を自動的に拒否しません。次に、任意の日付関数を実行する場合は、最初にデータをサーバー・リソースの無駄であるdatetimeデータ型に変換する必要があります。

あなたはこれをやりたがっている理由があると言いますが、それが何であるかという手がかりをつけて、日付を処理するためのデータ型に格納する必要があります。

+0

+1 "floatは自動的に間違った日付を拒否しません。" – RedFilter

+0

たとえば、フロートがユリウス暦の日付である場合、 "不正な日付"はありません。より細かい解像度またはより長い時間範囲です。 –

+0

例:selectキャスト(キャスト(2958464をfloat)としてdatetime) – RedFilter

1

1の精度損失。解決の欠如は別です。

浮動小数点バージョンIEEE 754とVAXの浮動小数点です。

+0

しかし、これを計算できることに注意してください。たとえば、8バイト整数(または浮動小数点数)は、マイクロ秒精度(256 ** 8/1.000.000/60/60/24/365)で584000年を保存するのに十分です。 – schnaader

0

あなたはfloatとしてそのデータを格納するつもりなら、私は、フロート

1

SQLiteのは時間のフォーマット(の1つを使用すると、あなたが日時よりfloatとしてエポックからの秒数を格納したほうが良いと思いますエポック以降の整数部分と1日の端数としての小数部分を使用して、(64ビット)double floatを使用して、いくつかの値を使用できます。うまくいくようです。

SQLite Date and Time Functionsを参照してください。「形式12は浮動小数点値として表されたユリウス日です。」

15桁の小数点以下15桁を使用すると、何千年ものミリ秒の精度が得られます。

this Julian Date Converterによると、JD 9999999.99999はCE 22666 12月20日11:59:何アランは言った、プラス...メンテナンスの根本的な問題59.1 UT木曜日

4

。他の誰かがプロジェクトに来て、DBのdatetimeの浮動小数点数を見て、それに間違ったことをしようとするか、それを正しい型にリファクタリングしようとします。ちょっとしたことが起こっている。メンテナンスの全般的な問題は、何が起こっているのか、なぜそれをやっているのかを広範に文書化することで、ある程度まで緩和することができます。かかわらず精度の

+0

私はメンテナンスの問題を抱えています。私が言ったように、私はそれを行うための非常に良い理由があります。 – erikkallen

+0

私はあなたがそれをしてはいけないと言っているわけではありません。それはあなたの選択です。私はちょうどあなたを噛むことができるかどうかという質問に答えるだけです。少なくとも、メンテナンスの問題を緩和する手段としてこれをやっている理由を文書化することをお勧めします。 –

0

実際には、私の知る限りでは、MSSQLとOracleの実際(日と小数日として)浮動小数点数として内部ストア日付時刻を行う

select cast(0 as datetime), cast(0.5 as datetime) 
1900-01-01 00:00:00.000 1900-01-01 12:00:00.000 
+0

これは、日付が浮動小数点として格納されていることを証明するものではなく、キャスト時に浮動小数点の>日の変換があることを証明するだけです。 –

0

- あなたが開始点として選択したものを数に応じて、比較に問題があるかもしれません。

日時ごとに正確な浮動小数点数を作成できない場合は、別の浮動小数点数に解決された場合でも片方向と反対の両方を比較する2つの日付時刻を持つことができます。

1

精度が低下します。あなたがこれを実行する場合は、あなたが変換中に限り4ミリ秒を失う可能性があることを繰り返し見ることができます

select getdate(), cast(getdate() as float), cast(cast(getdate() as float) as datetime) 

:私はSQL Serverでテストしました。あなたのデータベースがsmalldatetimeのようなデータ型をサポートしていて、2番目の精度だけが必要な場合は、この相違を滑らかにすることができます。ここで

+0

静的な日付で行う必要があります。 – dotjoe

+0

- 良い例があります... declare @d datetime; を設定する@d = '2009-05-27 16:33:54.260' @dを選択すると、 キャスト(キャスト(@dはフロート)をdatetimeとします)、 キャスト(キャスト(キャスト(キャスト(キャスト@dはフロート) as datetime)as float)as – dotjoe

+0

これは実質的に静的な日付であるため、1つのステートメントでgetdate()を使用して異なる日付を返すことはありません。 – RedFilter

4

は、日時は2、4バイトのint型として格納されているか、バイナリ(8を使用することができますように見える、という読みから

http://www.sql-server-performance.com/articles/dev/datetime_datatype_p1.aspx

の「SQL ServerのDATETIMEデータ型の神秘を解く」で良い記事です)

他の人が言っているように、フロートとして保存すると精度が失われます。

0

フロートを使用することの潜在的な欠点は、システムの組み込み日付操作関数を使用できなくなることです。間隔の計算だけを行っている場合は、浮動小数点は問題ありませんが、カレンダーに関連するものは何らかのホイールを再作成する必要があります。

ところで、Oracleが、少なくともその内部日付表現のための固定されたフィールドを使用しているようだ:

 
select 
    to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') as Date_Value, 
    dump(sysdate) as Internals 
from dual; 

DATE_VALUE   INTERNALS             
------------------- ------------------------------------------------------------ 
2009-05-28 09:51:12 Typ=13 Len=8: 217,7,5,28,9,51,12,0       
1 row selected 
関連する問題