■sql実験-日付-

 ●日付の判定ではまってしまったので確認をかねて試してみました。
  timestampをdateで判定すると、どうなるかです。

 ●まずテーブルを作ります。

CREATE TABLE test_table
(
  id serial NOT NULL,
  date timestamp without time zone NOT NULL,
  CONSTRAINT test_table_key PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE test_table
  OWNER TO testuser;

 ●データは以下のようにします。

1;"2014-10-29 00:00:00"
2;"2014-10-29 20:00:00"
3;"2014-10-29 23:59:59"
4;"2014-10-30 00:00:00"
5;"2014-10-30 00:00:01"

--------------------------------------------------------------------------------
 ●1、以下のsqlを実行します
select * from test_table where date = '2014-10-29'
 ○結果
1;"2014-10-29 00:00:00"

 ※検索結果は"2014-10-29 00:00:00"1件のみ
  dateの指定 2014-10-29 とはtimestampでは 2014-10-29 00:00:00 と言う事ですね
--------------------------------------------------------------------------------
 ●2、以下のsqlを実行します
select * from test_table where date >= '2014-10-29' AND date <= '2014-10-30'
 ○結果
1;"2014-10-29 00:00:00"
2;"2014-10-29 20:00:00"
3;"2014-10-29 23:59:59"
4;"2014-10-30 00:00:00"

 ※;"2014-10-30 00:00:01"のデータが検索されません
  上で確認した通り 2014-10-30 がtimestampでは 2014-10-30 00:00:00 なので
  2014-10-30 00:00:01は範囲から外れてしまいます。

  sqlを正確に書くと

select * from test_table where date >= '2014-10-29 00:00:00' AND date <= '2014-10-30 00:00:00'

  こうなる訳ですね。ただ最初の

select * from test_table where date >= '2014-10-29' AND date <= '2014-10-30'
  
  これだと2014-10-30分全部が入りそうですが実際は2014-10-30 00:00:00なので10/30は
  ほとんど入りません。これが今回はまった所です。
--------------------------------------------------------------------------------

timestampをdateで判定出来てしまいますが、内部的にはdateをtimestampに変換して
判定していると言う事ですね。考えてみると当たり前なのですがプログラムでパラメータ
を使い、date型を指定してtimestampの項目を判定しても判定出来てしまい、最後の日付
以外は上手く動いていたので中々気づきませんでした。
恐らくDB側で型キャストして動いてくれているのだと思いますが詳細は調べれませんでした。

--------------------------------------------------------------------------------

今回の実験もpgAdminだとsqlを簡単に試せます。上のメニューのsqlのアイコンをクリックするとsqlが実行出来ます。


実行するとこうなります。


簡単に試せるのが良いですね。

トップへ戻る