- ベストアンサー
date型でのbetweenについて教えてください。
皆様、新年明けましておめでとうございます。 早速ですが、date型でのbetweenについて教えてください。 SQL文 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' を発行すると、2007-12-31のレコードがあるのに該当しません・・・ 試しにSQL文を SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59' としても2007-12-31のレコードは検索されません・・・ SQL文を SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01' にすると2007-12-31が該当するのですが、 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' では2007-12-31のレコードは該当しないものでしょうか?? select * from test where num between 10 and 100 とした場合では、num が 10 ~ 100 のものが問い合わされますよね?? date型になるとこうならないのでしょうか?? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
No.1です。 列の属性をtimestampにして実行してみました。 Welcome to psql 8.2.0, the PostgreSQL interactive terminal. farm=# create table testtbl6 (hoge timestamp); CREATE TABLE farm=# insert into testtbl6 values('2007-12-31'); INSERT 0 1 farm=# select * from testtbl6; hoge --------------------- 2007-12-31 00:00:00 (1 row) farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31'; hoge --------------------- 2007-12-31 00:00:00 (1 row) farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31'; hoge --------------------- 2007-12-31 00:00:00 (1 row) ●時間だけを多少進めたデータを追加してみました farm=# insert into testtbl6 values('2007-12-31 01:00:00'); INSERT 0 1 farm=# select * from testtbl6; hoge --------------------- 2007-12-31 00:00:00 2007-12-31 01:00:00 (2 rows) farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31'; hoge --------------------- 2007-12-31 00:00:00 (1 row) farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200 7-12-31'; hoge --------------------- 2007-12-31 00:00:00 (1 row) よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、 検索でヒットしないのではないのでしょうか?
その他の回答 (2)
- venzou
- ベストアンサー率71% (311/435)
>●dateカラムの型はtimestampとなっております。 date型と timestamp型は別物ですよ。 キチンと区別して下さいね。 ------------------------------------------------------------- >SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59' 時間を指定するなら、下記では? dateなら、時間の部分は切り捨てられます。 SELECT * FROM test WHERE hoge between timestamp '2007-12-01 00:00:00' and timestamp '2007-12-31 23:59:59'; ------------------------------------------------------------- 又は、型変換で date型に変換してみるとか、どうでしょう? SELECT * FROM test WHERE date(hoge) between date '2007-12-01' and date '2007-12-31';
>SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' where の右横のdateはbetweenする列名に変更してください。 当方の実行結果を貼り付けます↓ farm=# create table testtbl5 (hiduke date); CREATE TABLE farm=# insert into testtbl5 values ('2007-12-31'); farm=# select * from testtbl5; hiduke ------------ 2007-12-31 (1 row) farm=# select * from testtbl5 where hiduke between '2007-01-01' and '2007-12-31'; hiduke ------------ 2007-12-31 (1 row)
補足
ご返答ありがとうございます。 > where の右横のdateはbetweenする列名に変更してください。 ●まぎらわしかったですが、dateは参考までで、カラム名だと思ってください。 > farm=# create table testtbl5 (hiduke date); ●dateカラムの型はtimestampとなっております。 これでも該当ありとなるでしょうか??
お礼
ズバリご指摘の通りでした・・・汗 時間が回っておりました。 ありがとうございました。