• ベストアンサー

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型になるとこうならないのでしょうか?? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#246547
noname#246547
回答No.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時を少し回っているデータが登録されているため、 検索でヒットしないのではないのでしょうか?

nerotom
質問者

お礼

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

その他の回答 (2)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

>●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';

noname#246547
noname#246547
回答No.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)

nerotom
質問者

補足

ご返答ありがとうございます。 > where の右横のdateはbetweenする列名に変更してください。 ●まぎらわしかったですが、dateは参考までで、カラム名だと思ってください。 > farm=# create table testtbl5 (hiduke date); ●dateカラムの型はtimestampとなっております。 これでも該当ありとなるでしょうか??

関連するQ&A

  • MATCHとBETWEENを併用したい

    namesテーブルのcontentsカラムにねこを含むレコードのうち、 現在までに書き込まれたものを新しいものから抽出したいと思います。 contentsはverchar(255)、unixtimeはint(11)です。 しかし、 SELECT * FROM names WHERE MATCH (contents) AGAINST ('+ねこ' IN BOOLEAN MODE) AND BETWEEN unixtime < 1360850220 ORDER BY `unixtime` DESC limit 1,50 ; が出力されません。 このSQL文はどこが間違っているのか、ご指摘ください。 SELECT * FROM names WHERE MATCH (contents) AGAINST ('+ねこ' IN BOOLEAN MODE) ORDER BY `unixtime` DESC limit 1,50 ; だと出力されるので AND BETWEEN unixtime < 1360850220 が怪しいと思うのですが、どう訂正したらいいのかわかりませんでした。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • タイムスタンプ型を抽出条件に指定した場合のSQL

    タイムスタンプ型を抽出条件に指定した場合、どの様なSQL文を指定すれば良いでしょうか? 該当するレコードは確かに存在していますが、以下のSQL文では「空」になってしまいました。 【実行したSQL文】 SELECT フィールド FROM テーブル WHERE タムスタンプ型フィールド BETWEEN '2011-08-05 20:00:00' AND '2011-08-06 19:59:59' 何卒、ご教授頂ければと存じます。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • date型を年月で指定するSQL文

    初歩的な質問かと思いますが… ご質問失礼いたします。 SQL文で2000年の1月を表示させたい時、 SELECT * FROM syouhin WHERE nengatsuhi BETWEEN '2000/1/1' AND '2000/1/31 というように、BETWEENではなく、 SELECT * FROM syouhin WHERE nengatsuhi = ?? BETWEENを使わずに2000年1月だけを指定することは可能でしょうか?

    • ベストアンサー
    • MySQL
  • 文字列のフィールドのOrderbyについて

    Oracle9iです。(厳密にはVB6も絡んでいます) 説明の便宜上、若干簡略化しています。 テーブルtestがあります。 SQL> desc test; 名前 NULL? 型 --------- -------- ---------------- ID VARCHAR2(10) です。 (1)testテーブルのデータが、 SQL> select id from test ; ID ---------- 3 5 11 551 のとき、select id from test where id between 1 and 4;を実行すると、 ID ------- 3 select id from test where id between '1' and '4';を実行すると、 ID ------- 3 11 となってしまいます。 別のケースで、 SQL> select id from test ; ID ---------- 3 5 11 551 C44433 aaa 6行が選択されました。 のデータの場合、 select id from test where id between 1 and 4;はORA-01722:数字が無効です のエラーとなり、 select id from test where id between '1' and '4';だと ID ------- 3 11 となってしまいます。 自分の希望としては select id from test where id between '1' and '4'にて、 ID ------- 3 のみ表示をさせたいです。 (2)SQL> select id from test ; ID ---------- 3 5 11 551 C44433 aaa のとき、たとえば、 select id from test where id between '12' and 'DD'; を実行し、12以上でDD以下のデータを取得したいのですが、 (理想) ID ---------- 551 C44433 実際は、 ID ---------- 3 5 551 C44433 と出てしまいます。 仕様は上司が考えてるので、 テーブル構造にそもそも問題があるのならそれ相応の説明をしたいと思っています。 ですが、基本的にはSQLの条件文を変更したいのですが、 アドバイスをいただけたらと思います。 ちなみに説明の簡略化のためフィールドを少なくしていますので select RPAD(id , 10) from test where ~ のように select のあとに変換するのはできません。 実環境は基本的には select * from ~としたいので。 よろしくお願いいたします。

  • TO_DATEの使い方を教えて下さい

    Oracleを習い始めたばかりで、とても初歩的な質問ですみません。 customer_numberが124でorder_dateが09/05/98のレコードをSELECTしたいのですが、 TO_DATEを使うとうまくいきません。 その条件に合うレコードは存在して、日付をデフォルトの形で書くとSELECTできます。 TO_DATEの使い方を間違えているのでしょうか。 よろしくお願いします。 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date='05-SEP-98'; ORDER ----- 12500 SQL> select order_number 2 from orders 3 where customer_number='124' and order_date=to_date('09/05/98','MM/DD/YY'); no rows selected

  • betweenで境界値が取得できない。

    連番の歯抜け値を取得するSQLを作りたいと思っています。 例えば、カラムAに、1,2,3,5,6,7,9,10(4と8が抜けている) と数値の入っているテーブルAがあるとします。 これに対して、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) とSQLを投げた場合、4が取得できます。 これにbetween句を付与したいのですが、そうすると境界値が なぜか取れなくて困ってます。 具体的には、 SELECT MIN(カラムA + 1) FROM テーブルA WHERE (カラムA + 1) NOT IN (SELECT カラムA FROM テーブルA) AND BETWEEN 8 AND 10 とした場合、NULLが返ってきてしまいます。 普通、BETWEENは境界値も対象になるはずですが、何故このような 結果になってしまうのでしょうか? 修正点をご教授いただけないでしょうか? 宜しくお願いします。

  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • SQLのBetween句

    SQL初心者です。 どなたかヒントでもよいのでご教授お願いします。 分からない箇所は以下の2つです。(SQLは下方に示しています) ・where句のbetweenの箇所にカラム指定箇所にTO_CHAR(SYSDATE -2, 'YYYYMMDD') を入れた時、何を評価しているのか? ・where句のbetweenの条件部分のカラム名に(+)をつけた場合何を意味しているのか? この2つがどうしても分かりません。 このSQLについて知識お持ちに方よろしくお願いします。 環境は次の通りです。 ------------------------ ■環境 ・OracleDatabase10.2 ■テーブル構成 テーブルは以下の2つです。 ・sample1 ・sample2 sample1テーブルに以下のカラムがあります。 ・test1 sample2テーブルに以下のカラムがあります。 ・test2 ------------------------ ■SQL SELECT * FROM sample1 s1, sample2 s2 WHERE TO_CHAR(SYSDATE -2, 'YYYYMMDD') BETWEEN s1.STAYMD(+) AND s2.(+)

  • HAVING句でのBETWEEN演算子

    HAVING句でのBETWEEN演算子の使い方について教えていただけますでしょうか。 MS SQL SERVER のフロントエンドとしてMS ACCESS でパススルークエリを作成中です。 以下のようなテーブルがSQL SERVERにあります。 ID    TIME AAA   2005/06/01 00:00:10 BBB   2006/02/01 00:00:10 CCC   2006/03/01 00:00:10 AAA   2006/02/01 00:00:10 BBB   2006/02/02 00:00:10 CCC   2006/03/02 00:00:10 MS ACCESS パススルークエリで以下のようなSQL文を作成しました。 SQL文 SELECT ID, TIME FROM JOB WHERE TIME between '2006/01/01 00:00:00' and '2006/02/15 23:59:59' 結果 ID    TIME BBB   2006/02/01 00:00:10 AAA   2006/02/01 00:00:10 BBB   2006/02/02 00:00:10 抽出条件は TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' のままとし、IDをグルーピングしたいと思い以下のように書き換えましたが正しい記述では無いようでエラーとなってしまいます。 SELECT ID, TIME FROM JOB GROUP BY CODE HAVING TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' ORDER BY ID 欲しい結果 ID AAA BBB 正しい記述を教えていただけますでしょうか。 よろしくお願いいたします。

  • MySQLの日付型データをBetweenで抽出する方法

    MySQL で格納したデータを Perl を使ってブラウザに出力したいのです が、日付型で格納したデータを Between で範囲を指定して出力しても 条件通り出力できません。 Between 式が間違っているまでは把握しているのですが、修正方法が 分かりません。どなたか教えていただけませんか? # $form->param('combo1')は、2006 が格納されている $date1 = $form->param('combo1') . "/04/01"; $date2 = $form->param('combo1')++ . "/03/31"; # $date1 の値は、2006/04/01 # $date2 の値は、2007/03/31 $sql = "SELECT Itaku_Date FROM table WHERE "; $sql .= "Between " . $date1 . " And " . $date2;