web-dev-qa-db-ja.com

SQLiteでDATETIME値はどのように機能しますか?

Androidアプリを作成していますが、作成レコードの日付/時刻を保存する必要があります。ただし、SQLiteのドキュメントには、「SQLiteには日付や時刻を保存するためのストレージクラスがありません」と「日付、時刻をTEXT、REAL、またはINTEGER値として保存できる」とあります。

あるタイプを別のタイプよりも使用する技術的な理由はありますか?また、単一の列に、行から行への3つの形式のいずれかで日付を格納できますか?

後で日付を比較する必要があります。たとえば、私のアプリでは、日付Aから日付Bまでの間に作成されたすべてのレコードを表示します。真のDATETIME列がないと比較が難しくなるのではないかと心配です。

101
Khairil Ushan

SQliteには特定の日時タイプはありません。必要に応じて、TEXTREAL、またはINTEGERタイプを使用できます。

DOCSから直接

SQLiteには、日付や時刻を保存するためのストレージクラスが用意されていません。代わりに、SQLiteの組み込みの日付と時刻関数は、日付と時刻をTEXT、REAL、またはINTEGER値として保存できます。

  • ISO8601文字列としてのテキスト( "YYYY-MM-DD HH:MM:SS.SSS")。
  • 紀元前4714年11月24日のグリニッジ標準時からのユリウス日数としてのREAL予後グレゴリオ暦によると。
  • INTEGER、Unix時間、1970-01-01 00:00:00 UTCからの秒数。

アプリケーションは、これらの形式のいずれかで日付と時刻を保存し、組み込みの日付と時刻の関数を使用して形式間で自由に変換することを選択できます。

SQLiteの組み込みの日付および時刻関数は、 here にあります。

77
neo108

SQLiteには、日付や時刻を保存するためのストレージクラスが用意されていません。代わりに、SQLiteの組み込みの日付と時刻関数は、日付と時刻をTEXT、REAL、またはINTEGER値として保存できます。

ISO8601文字列としてのテキスト( "YYYY-MM-DD HH:MM:SS.SSS")。紀元前4714年11月24日のグリニッジ標準時からのユリウス日数としてのREAL予後グレゴリオ暦によると。 INTEGER、Unix時間、1970-01-01 00:00:00 UTCからの秒数。アプリケーションは、これらの形式のいずれかで日付と時刻を保存し、組み込みの日付と時刻の関数を使用して形式間で自由に変換することを選択できます。

そうは言っても、INTEGERを使用して、Unixエポック(1970-01-01 00:00:00 UTC)からの秒数を保存します。

18

SQLiteの強力な機能の1つは、ストレージタイプを選択できることです。 3つの異なる可能性のそれぞれの利点/欠点:

  • ISO8601ストリング

    • 文字列比較により有効な結果が得られます
    • 小数秒、最大3桁の10進数を格納します
    • より多くのストレージスペースが必要
    • データベースブラウザを使用すると、その値が直接表示されます
    • 他の用途の解析の必要性
    • 「デフォルトのcurrent_timestamp」列修飾子は、この形式を使用して格納されます
  • 実数

    • 小数秒に関する高精度
    • 最長の時間範囲
  • 整数

    • 最小の保管スペース
    • 素早い操作
    • 短い時間範囲
    • 可能性のある2038年問題

異なるタイプを比較したり、外部アプリケーションにエクスポートしたりする必要がある場合、必要に応じてSQLiteの 独自の日時変換関数 を自由に使用できます。

10
Zso

実質的にすべての日付と時刻の問題について、私は非常に単純なものを単純化することを好みます...整数で格納される秒まで。

整数は、データベース、フラットファイルなどの整数として常にサポートされます。ちょっとした計算をして別の型にキャストすると、いつでも日付をフォーマットできます。

このようにすることで、[現在のお気に入りデータベースをここに挿入]が、今日選択した日付形式を偶然使用しなかった[将来のお気に入りデータベース]に置き換えられても心配する必要はありません。

それはほんの少しの数学的なオーバーヘッドであり(例:メソッド-2秒かかります。必要に応じてGistを投稿します)、後で日付/時刻に関する多くの操作を簡素化します。

6
KelvinEWilliams

タイプlongのフィールドに保存します。 Date.getTime()およびnew Date(long)を参照してください

5
koem