2011-09-14 18 views
3

現在、私のテーブルには日付と時刻を格納する列があります。その列のデータ型は、タイムゾーンなしのタイムスタンプです。したがって、値は'2011-09-13 11:03:44.537'の形式になります。タイムスタンプ列から日付範囲を選択

日付を基準にして行を取得する必要があります。私が使用している場合: ':03:44.537 2011-09-13 11' と '2011-09-12 11:03:44.537'

select * from table where mdate >= '2011-09-13 11:03:44.537' 
         and mdate <= '2011-09-12 11:03:44.537' 

それが間にある値を提供します。

しかし、私はつもりだ場合:日、月、秒なし

select * from table where mdate >= '2011-09-13 00:00:00.0' 
         and mdate <= '2011-09-12 00:00:00.0' 

、これは、任意の行が表示されていません。

日付に関するこのテーブルの値の取得方法(日付のみ、時、分、秒は無視)?

でも、列にはタイムスタンプ付きの日付があります。タイムスタンプを無視するか、時、分、秒を0'2011-09-13 00:00:00.0'など)にする必要があります。

答えて

4

フィールドのtimestampの値をdateにキャストする場合は、比較のために列内のすべての値をキャストする必要があり、単純なインデックスを使用できないため、パフォーマンスが低下します。あなたはそうのような、特別なindex on the expressionを作成する必要があります。この場合

CREATE INDEX some_idx ON tbl (cast(mdate AS date)); 

はクエリがまたに簡素化する必要があります。

SELECT * FROM tbl WHERE mdate::date = '2011-09-12'::date; -- 2nd cast optional 

しかし、私の知る限り、あなたの問題がありますあなたの質問に単純なタイプミスがあります:
あなたはアッパーを&下限に変更しました。試してみてください:

SELECT * FROM tbl WHERE mdate >= '2011-09-12 00:00:00.0' 
        AND mdate <= '2011-09-13 00:00:00.0';

それとも、あなたの構文を簡素化し、より正確には:

SELECT * FROM tbl WHERE mdate >= '2011-09-12 00:00' 
        AND mdate < '2011-09-13 00:00'; 
  • あなたドン」は、秒、分画を綴るする必要はありません2011-09-13 00:00を含める場合は、<=の代わりに<を使用してください。
    は、同様の理由で、ここにBETWEENを使用しないでください:

    
                   
        
          WHERE mdate BETWEEN '2011-09-12 00:00' AND '2011-09-13 00:00' 
        

    これは、次の日の午後12時00分が含まれます。

timestamp [without time zone]の列は、現在のタイムゾーンの設定に従って解釈されることにも注意してください。日付部分はその設定に依存しますが、通常は期待通りに動作するはずです。詳細:
Ignoring timezones altogether in Rails and PostgreSQL

1

ただ、日付とタイムスタンプを扱う:

select * 
from table 
where mdate::date >= DATE '2011-09-12' 
    and mdate::date <= DATE '2011-09-13' 

表現mdate::dateは、値から時刻部分を削除しますdate型にタイムスタンプをキャストします。

DATE '2011-09-13'は、言語設定の影響を受けないため、「2011-09-13」と書くよりも少し頑丈な(標準)DATEリテラルです。

+0

おかげでたくさん... それは.... –

+0

'mdate :: date'と' DATEのmdate' ARの代名詞を助けてくれました。 '' 2011-09-13 ':: date'と 'date' 2011-09-13''は同義です。 異なる構文スタイルです。あたかも違いがあるように見えるようにします。 –

+0

@Erwin:「2011-09-13」はシステム設定に依存していませんか? 1つのインストールでは動作するが別のインストールでは動作しないようにするには? –

関連する問題