電子書籍の厳選無料作品が豊富!

皆様、新年明けましておめでとうございます。

早速ですが、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型になるとこうならないのでしょうか??

よろしくお願いします。

A 回答 (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時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?
    • good
    • 0
この回答へのお礼

ズバリご指摘の通りでした・・・汗
時間が回っておりました。

ありがとうございました。

お礼日時:2008/01/11 18:42

>●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';
    • good
    • 1

>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となっております。

これでも該当ありとなるでしょうか??

補足日時:2008/01/07 11:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!