2016-08-18 49 views
0

テーブルに「start_time」と「end_time」のフィールドを持つPSQLデータベースがあります。PostgreSQLの日付範囲クエリ

これらは、jsonファイルから文字列としてデータベースのテキストフィールドにインポートされます。文字列の形式は次のとおりです。yyyy-mm-dd hh:mm:ss データベース内の特定の日付範囲内のテーブルのすべてのIDを取得するクエリを実行したいとします。

これを行うには、2つのうちのいずれかを実行できます。いずれかの日付範囲の開始時刻と終了時刻のリストを照会することができます。その照会からの戻り値は、取得しようとしている実際のデータの個別の照会を行います

もう1つのオプションは、行のフォーマットを比較可能なものに変更する方法。フィールドがテキストフィールドでない場合は、WHERE start_time > beginning of date range AND end_time > end of date rangeのようなものです。

日付範囲は、ウェブサイトの日付選択ツールから取得されます。

これは重複した投稿かもしれませんが、いずれかの解決策を何時間も探してから何も起こっていません。正しい方向に何かが役立ちます。

おかげ

+0

私はここに、あなたの質問が何であるかわからないと思います。タイムスタンプをタイムスタンプまたはテキストとして保存する方が良いかどうかを確認していますか?または、テキストタイムスタンプをタイムスタンプタイムスタンプに変換する方法を尋ねていますか? – jmelesky

+0

関連性のないものにタグを追加しないでください。これはMySQLではなく、Postgresです。 – tadman

+0

タグが追加され、バックグラウンド情報が追加されました。これは、Pythonのサーバー側またはJavaScriptのクライアント側のいずれかで、日付をクエリに入れる前または後に情報を処理する優れたソリューションがありました。しかし、ポストグルは魔法であり、ボリスの答えはまさに私が探しているものです。 –

答えて

1

PostgreSQLはこのケースではあなたに簡単に行く必要があります。文字列をタイムスタンプにキャストして比較するだけです。

これは、箱から出して動作するはずです:

WHERE start_time::timestamp > '2016-01-01' AND end_time::timestamp < '2016-12-31' 
+0

正解です。ただ2つの修正。 1. 2番目の比較は「<' not '>」である必要があります。 2.ビッグデータセットでのパフォーマンスを得るには、これらのテキストフィールドに式インデックスが必要な場合があります。 'CREATE INDEX mytable_start_time_idx ON mytable(start_time :: timestamp);' 'CREATE INDEX mytable_end_time_idx ON mytable(end_time :: timestamp);' – filiprem

+0

あなたが言うことはすべて真です。インデックスは適切な方法です。はい、間違いをして質問自体からクエリをコピーしました。 –

+0

あなたの答えにもう一つのバグがあります。タイムスタンプ<日付比較。 「2016-12-31 23:55:00」は「2016-12-31」よりも小さくないことに注意する必要があります。したがって、あなたのクエリには、 '' 2016-12-31 00:00:00 "より遅いものは含まれません。右側は 'end_time :: timestamp <= '2016-12-31 23:59:59.999''または' end_time :: date <=' 2016-12-31''(より簡単に入力できます) 。 – filiprem