2009-09-06 11 views
8

SQLite docsは、DBにdatetime値を格納するための推奨フォーマットがJulian Day(組み込み関数を使用)を使用することを指定しています。SQLiteでjuliandayとしてDateTimeデータを保存するのはどうですか?

しかし、python(pysqlite、SQLAlchemy)で見たすべてのフレームワークは、datetime.datetimeの値をISO形式の文字列として格納しています。なぜ彼らはそうしていますか?

私は通常、フレームワークをjuliandayとしてdatetimeを格納するように調整しようとしています。かなり苦しいです。私はそれが努力する価値があるのか​​疑問に思った。

この分野のあなたの経験を私に伝えてください。ジュリアンディと付き合っても意味がありますか?

答えて

5

両方の方法で保存します。フレームワークはその方法で設定することができます。ISO形式の文字列を持つ未加工の列を見つけようとしている場合、それは価値があるよりも回避するのが難しいでしょう。

2つのカラムを持つことの懸念は、データの一貫性ですが、sqliteは、それを動作させるために必要なものすべてを備えている必要があります。バージョン3.3は検査制約とトリガーをサポートしています。 date and time functionsにお読みください。必要なことをデータベースで完全に行うことができるはずです。

CREATE TABLE Table1 (jd, isotime); 

CREATE TRIGGER trigger_name_1 AFTER INSERT ON Table1 
BEGIN 
    UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = last_insert_rowid(); 
END; 

CREATE TRIGGER trigger_name_2 AFTER UPDATE OF isotime ON Table1 
BEGIN 
    UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = old.rowid; 
END; 

そして、あなたはDB内に何が必要行う傾けるならば、あなたは必要な機能を実行するためにC拡張を書くことができます。そうすれば、エクステンションをロードする以外のフレームワークに触れる必要はありません。

+0

この提案をありがとう!それは素晴らしい考えであり、この問題で私の問題のすべての種類を解決します。 –

+1

なぜあなたはそれを両方の方法で保存する必要がありますか?ユリウス日をISO形式の文字列に格納する唯一の本当の利点は、ストレージスペースです。フレームワークでISO形式の文字列が必要な場合は、それを使用してください。すべてのSQLiteの[datetime関数](http://www.sqlite.org/lang_datefunc。html)は、ISO文字列だけでなく、ジュリアン日も処理できます。 – Martijn

6

ジュリアンデーは、あらゆる種類の日付計算に便利ですが、時間の部分を正確に(時、分、秒で)保存することができます。過去に私はジュリアン・デイ・フィールド(日付用)とseconds-from-the-Epoch(datetimeインスタンス用)の両方を使用しましたが、計算のための特定の必要性があったときのみでした。 ISOフォーマットの日付と日付のシンプルさは、私が考えているように、時間の約97%を好む選択肢にしてください。

+1

(例えば)によって人間の読めるに変換されます。 ありがとう! –

+0

juliandayの精度が何時間、何分、何秒で十分でないのか少し説明してください。 –

+0

@ Slavaでは、倍精度浮動小数点の小数部として正確に表現することはできませんが、後者の表現はバイナリ形式で86400はaではないため、「1秒」:1/86400です。 2の威力。 –

0

2455369.5318981484よりも2010-06-22 00:45:56が人間にとって読みやすくなります。テキスト日付は、SQLiteSpyまたはSQLite Managerでアドホッククエリを実行するのに最適です。

主な欠点は、もちろん、そのテキストの日付ではなく、典型的には8

1

しかしの19バイトが必要であり、人間は、データベースから直接読み取りません。ユリウス日のフラクショナル時間を簡単に、私はそうしないように明示的な理由があるまで、だから私は、フレームワークのデフォルト設定に固執します

void hour_time(GenericDate *ConvertObject) 
{ 
    double frac_time = ConvertObject->jd; 
    double hour   = (24.0*(frac_time - (int)frac_time)); 
    double minute  = 60.0*(hour - (int)hour); 
    double second  = 60.0*(minute - (int)minute); 
    double microsecond = 1000000.0*(second - (int)second); 

    ConvertObject->hour   = hour; 
    ConvertObject->minute  = minute; 
    ConvertObject->second  = second; 
    ConvertObject->microsecond = microsecond; 

}; 
関連する問題