8

SQLite docsは、DBに日時値を格納するための推奨形式は(組み込み関数を使用して)ユリウス日を使用することであると指定しています。

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

私は通常、フレームワークをユリウス日として日時を保存するように適応させようとしていますが、それは非常に苦痛です。私はそれが努力する価値があるのではないかと疑い始めました。

この分野でのあなたの経験を私と共有してください。ユリウス日を守ることは理にかなっていますか?

4

4 に答える 4

6

ユリウス日はあらゆる種類の日付計算に便利ですが、時間の部分を適切に (正確な時間、分、秒で) 格納できます。過去に、ユリウス日フィールド (日付用) とエポックからの秒数 (datetimeインスタンス用) の両方を使用しましたが、(日付とそれぞれの時刻の) 計算が必要な場合にのみ使用しました。ISO 形式の日付と日時の単純さは、97% の確率で好まれる選択肢になると思います。

于 2009-09-06T17:10:49.327 に答える
5

両方の方法で保管してください。フレームワークはそれぞれの方法で設定できます。ISO形式の文字列を含む生の列を見つけることを期待している場合、それはおそらくそれが価値があるよりも回避するのが面倒です。

2つの列を持つことの懸念はデータの一貫性ですが、sqliteはそれを機能させるために必要なすべてを備えている必要があります。バージョン3.3は、チェック制約とトリガーをサポートしています。日付と時刻の関数を読んでください。データベースで必要なことを完全に実行できるはずです。

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拡張機能を作成できます。そうすれば、拡張機能をロードする以外にフレームワークに触れる必要はありません。

于 2009-09-09T12:57:15.477 に答える
1

しかし、通常、人間はデータベースから直接読み取りません。ユリウス日の小数時間は、(たとえば) によって人間が読める形式に簡単に変換できます。

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;

};
于 2011-01-08T14:36:32.193 に答える
0

なぜなら2010-06-22 00:45:56、人間は。よりもはるかに読みやすいからです2455369.5318981484。テキストの日付は、SQLiteSpyまたはSQLiteManagerでアドホッククエリを実行するのに最適です。

もちろん、主な欠点は、テキストの日付が8バイトではなく19バイトを必要とすることです。

于 2010-06-22T00:50:37.680 に答える