見守り電球またはGPS端末が特価中!

たとえば

データ(1)
A:11時 B:13時

データ(2)
A:18時 B:0時

データ(3)
A:23時 B:3時


現在時刻が12時の場合
データ(1)が抽出

現在時刻が17時なら
データ(2)(3)が抽出

現在時刻が0時なら
データ(2)(3)が抽出


のように
現在時刻が期間AからBに該当する場合に
データがHITするような
SQLを作りたいのですが
うまくいきません

where 'now' between A and B;

ではうまくいきませんでした

何か良いSQLはありませんか?

ちなみにTIME型データです

それ以外のデータ型でもいいです
希望通りの動きをするなら・・・

よろしくお願いします

A 回答 (3件)

TIME型は24:00:00までしか入らないのですね。


ごめんなさい。

表示時間が0時に掛かる場合の検索条件をORで加えてみてはどうでしょう。
select * from test where (a <= b and a <= CURRENT_TIME AND CURRENT_TIME < b) or (a > b and (CURRENT_TIME < b or a <= CURRENT_TIME));

/* テストデータ */
insert into test values ('21:00:00', '2:00:00');
-- 9時から24時まで表示
insert into test values ('9:00:00', '0:00:00');
-- 0時から9時まで表示
insert into test values ('0:00:00', '9:00:00');
insert into test values ('15:00:00', '20:00:00');

/* 結果(試験時、22時30分)*/
a | b
----------+----------
21:00:00 | 02:00:00
09:00:00 | 00:00:00
(2 rows)

参考URL:http://www.postgresql.jp/document/pg824doc/html/ …
    • good
    • 0
この回答へのお礼

ありがとうございます!!

おかげさまで
希望通りの動きをすることができました!

お礼日時:2007/09/20 14:53

PostgreSQL8.2.4です。


CURRENT_TIMEで現在の時間が得られます。

-- テスト用のテーブル
create table test (
a time,
b time
);

-- テストデータ
insert into test values ('9:00:00', '12:00:00');
insert into test values ('15:00:00', '20:00:00');
insert into test values ('9:00:00', '0:00:00');
insert into test values ('9:00:00', '24:00:00');

-- クエリ
cre-at=> select * from test where a < CURRENT_TIME AND CURRENT_TIME < b;

-- 結果(これを書いている時は12時前なので)
a | b
----------+----------
09:00:00 | 12:00:00
09:00:00 | 24:00:00
(2 rows)

bが0時を過ぎる時は、「24時」のようにデータを挿入しないと検索されませんね。

参考URL:http://www.postgresql.jp/document/pg824doc/html/ …

この回答への補足

解答ありがとうございます

さっそく試してみたのですが

insert into test values ('35:00:00', '12:00:00');
上記のようにすると

ERROR: date/time field value out of range: "35:00:00"

となってしまいます。

insert into test values (to_timestamp('35:00:00','HH24MISS'),'12:00:00');
上記のようにすると自動で変換されてデータは「11:00:00」扱いとなってしまいました

データの型はtime型です

データがそもそも入れれないので
動作を試すことができません。

補足日時:2007/09/19 15:21
    • good
    • 0

>現在時刻が17時なら


>データ(2)(3)が抽出

データ例から判断すると、矛盾していますが?

>where now between A and B;

nowは日時ですから、time型と直接比較できません。

time型なら、20時~6時と行った場合、条件を二つに分ける必要があります。20:00:00~23:59:59と、00:00:00~06:00:00でです。timestamp型なら、こういった操作は不要ですが、別の日のデータはヒットしなくなります。

>何か良いSQLはありませんか?
>それ以外のデータ型でもいいです
>希望通りの動きをするなら・・・

具体的なアドバイスが欲しいなら、やりたいことをもっと具体的にかつ正確に示してください。

この回答への補足

>現在時刻が17時なら
>データ(2)(3)が抽出
は間違いですすみません。

やりたいのは

現在時刻が設定時刻Aから設定時刻Bの間ならHIT

と言うことです。

設定時刻ABは共に自由に設定できて
入力できる数値は0~23(時)です
(もしくは24HMMSS)

Aが0時 Bが23時の設定の場合もあれば
Aが22時 Bが2時(26時)の場合もあります

設定期間内ならデータを抽出したいのです。

補足日時:2007/09/19 09:48
    • good
    • 0

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

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPostgreSQLのtimestamp型で時間(分)を抽出したい

PostgreSQLのあるテーブルで「開始時刻」と「終了時刻」というフィールドがあり、timestamp with timezone(例:2008-07-31 07:00:00+09)でデータを持っています。

例えば、日付に関係なく13:00から15:00までのデータを抽出したい場合、SQLのWHERE句にはどのように記述すればよろしいのでしょうか?

Aベストアンサー

それなら早く言ってよ(笑)
to_char(開始時刻, 'HH24:MI') >= '13:30'
AND to_char(終了時刻, 'HH24:MI') <= '15:40'

http://www.postgresql.jp/document/pg734doc/user/functions-formatting.html

参考URLの文章の中に関連事項のリンクもあったはず。

Qdate型での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型になるとこうならないのでしょうか??

よろしくお願いします。

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

早速ですが、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...続きを読む

Aベストアンサー

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

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 ...続きを読む

Q文字列を time 型に変換するには。

文字列を time 型に変換するには。

お世話になります。
PostgreSQL 8.2 & PgAdmin 1.6.3(WinServer 2003)を使用しています。
varchar 型のカラムに格納されている時刻を表す文字列('9:15' など)を time 型に変換してビューを作成する必要があるのですが、できずに困っています。

具体的には...

「table1」というテーブルに「時刻」(varchar 型)という名前のカラムを作成し、「9:15」という文字列を格納しておきます。

これをもとにビュー(view1)を作ろうとしているのですが、select 文のところで
、ERROR: syntax error at or near "時刻" SQLステート:42601 というエラー(構文エラー)が出てしまいます。

 select time 時刻 from table1
 結果:ERROR: syntax error at or near "時刻" SQLステート:42601


ちなみに、時刻を文字列で指定してやると、ちゃんと time 型で結果が返ります。

 select time '9:15'
 結果:09:15:00

抜本的に方法が間違っているとはおもうのですが、いくら調べてもこれを解決できるようなサイトが見当たりませんでした。

文字列を time 型に変換するにはどのようにしたらよいのかご教示いただけないでしょうか。
よろしくお願いします。

文字列を time 型に変換するには。

お世話になります。
PostgreSQL 8.2 & PgAdmin 1.6.3(WinServer 2003)を使用しています。
varchar 型のカラムに格納されている時刻を表す文字列('9:15' など)を time 型に変換してビューを作成する必要があるのですが、できずに困っています。

具体的には...

「table1」というテーブルに「時刻」(varchar 型)という名前のカラムを作成し、「9:15」という文字列を格納しておきます。

これをもとにビュー(view1)を作ろうとしているのですが、select 文のところで
、ERRO...続きを読む

Aベストアンサー

「time 定数」で「指定した定数をtime型と認識してね」という構文であり、「time 列名」という構文はありません。

標準SQL準拠の書き方であれば、

CAST(列名 AS TIME) [AS 別名]

PostgreSQL独自の書き方であれば、

列名::time

といった書き方もあります。

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

Qcastの使用法について(初心者です)

始めまして。初心者ですので基本的な質問になるかもしれませんがよろしくお願いします!

なぜかPostgreSQLを仕事に使うことになり、四苦八苦しています。

テーブルを作成しているときに、
create table syouhin (shinamono text, nedan int);
とするとします。
で、insert でデータを入れていきますが、
例:
shinamono | nedan
------------------
みかん |100
マンゴー |200

例えば、nedan のcast が今、int にしましたが、これをchar やfloatに変えたいときはどうすればよろしいのでしょうか?

どなたか御存じの方、お手数ですがお教え下さい!!!

Aベストアンサー

CAST関数の文法は、CAST(○ AS △) となります。
○:変換する値
△:変換する型

Select CAST(nedan AS char(10)) ~
とすればできると思いますよ

Qtimestampのデータはどのようにして入力

するのでしょうか?

create table tablex(no serial primary key,time timestamp);

insert into tablex(time) values(?);

において?の部分に入れる文字列のフォーマットはどうなるのでしょうか?

例えば
2005年5月5日5時55分55秒
を入れるにはどうしたらいいのでしょうか?

Aベストアンサー

'2005-05-05 05:55:55'

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Qpostgresのdatabase名と、そのencodingを取得する

postgresのdatabase名と、そのencodingを取得する方法を教えてください。



postgres8.1です。

システムカタログ
http://www.postgresql.jp/document/pg811doc/html/catalogs.html

pg_databaseの項目として持っているだろうと思い、見てみました。

encodingint4 このデータベースの文字符号化方式

これか?と思いましたが、数値IDのみでした。

この数値から、utf8やsjisといった情報にどうやったら繋がりますか?

Aベストアンサー

pg_encoding_to_char関数で文字エンコーディング名に変換できます。

=> SELECT datname, pg_encoding_to_char(encoding) FROM pg_database;
datname | pg_encoding_to_char
-----------+---------------------
template1 | UTF8
template0 | UTF8
postgres | UTF8
(4 rows)


人気Q&Aランキング