- PR -

JDBCで日付を比較する場合

投稿者投稿内容
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-07-24 17:45
引用:
データを再度確認したのですが、

確かに2007/04/01〜2007/07/01まで、
この形式で格納されておりました。

格納されているデータの型は?TIMEってカラムがDateTimeじゃないんじゃないですかね。
だとTIMEの方をTO_DATEしなきゃいけないかな。

#あと追記で、オラクル詳しくないからわかりませんが(TO_DATEってオラクルでいいんすよね)
#「TIME」って予約語ですよね。ダブルクオート(でいいのかな)で囲んだほうがいいとか、ないですかね。

[ メッセージ編集済み 編集者: べる 編集日時 2007-07-24 17:49 ]
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2007-07-24 17:48
ってかその CSE とかいうものがどういうものか不明なんですが、
SQL*Plus で確認できないんでしょうか。
そもそもデータがあるってのはどうやって確認されたんでしょう?

引用:

と直接CSEで実験したのですが、
変わらず・・・。



ってのは、SQL 直で実行してヒットしなかったってことなんでしょか。

あと、先にも書きましたがデータの時間があったりなかったりと
いうのは Oracle の DATE 型ではあり得ないんで CHAR とかその辺の
データ型を列に指定しているんだと思いますが、DATE 型列の表に
適当なデータを突っ込んで、それで動作確認できませんかね。

(なんか変なデータで票から取ってくるところで暗黙変換してるから
ヒットしないとかそんな気がする...)

_________________
もしもし@RMAN 友の会
佐久
会議室デビュー日: 2006/08/28
投稿数: 3
お住まい・勤務地: 船橋市
投稿日時: 2007-07-24 18:04
確認ですが、DBってOracleのいくつですか。
それとカラム名は TIME ですか?
それだと予約されてるから、上手く出来ないのかも

こっちでもちょいと試して見ました。
(DBはOracle10g。カラム名はTIMEじゃないテーブルで試しました。)
TIMEってかいてるカラムの型がTIMESTAMPでも、VARCHAR2でもCSEで問題なく検索できました。

↓が実際に使ったSQL
コード:
SELECT
    *
FROM
    HOGE_TABLE
WHERE
    HOGE_TIME BETWEEN TO_DATE('2007/04/01','YYYY/MM/DD') AND
    TO_DATE('2007/04/30','YYYY/MM/DD')

佐久
会議室デビュー日: 2006/08/28
投稿数: 3
お住まい・勤務地: 船橋市
投稿日時: 2007-07-24 18:24
ちょっと時間があったので、
Oracle10gで↓のテーブル作って試してみました。
(カラム名がTIMEなのがダメなのかなーって思って)

コード:

create table HOGE_TABLE(
MEMO VARCHAR2(256) NOT NULL ,
TIME TIMESTAMP NOT NULL
)


そいで下記のデータを投入。
コード:

MEMO TO_CHAR(TIME,'YYYY/MM/DD')
TEST 2007/04/01
TEST 2007/04/10
TEST 2007/04/15
TEST 2007/04/16


下記のSQLを実行して、上の3件だけ引っかかる事を確認しました。

コード:

SELECT
MEMO,
TO_CHAR(TIME,'yyyy/mm/dd')
FROM
HOGE_TABLE
WHERE
TIME BETWEEN TO_DATE('2007/04/01','YYYY/MM/DD') AND
TO_DATE('2007/04/15','YYYY/MM/DD')



んー・・・。DBのバージョン違いかSQLの書き間違えですかね・・・。
ちょっとわかんないですな。

---[追記です]------------------------------
とりあえずTIMEの型ってなんでしょうか?

[ メッセージ編集済み 編集者: 佐久 編集日時 2007-07-24 18:26 ]
java初心者
ベテラン
会議室デビュー日: 2007/07/23
投稿数: 54
投稿日時: 2007-07-25 16:02
佐久様
もしもし様
べる様

お忙しいところ、ありがとうございます。

>CSE とかいうものがどういうものか不明
CSEとは、Objectブラウザみたいなdb作成をサポートするツールです。

DBはOracle10gとなります。
カラム名は正確には「ODERTIME」という名です。

>とりあえずTIMEの型ってなんでしょうか?
カラムODERTIMEの型はJAVA上で作成しましたString型です。

>データの時間があったりなかったりと
>いうのは Oracle の DATE 型ではあり得ないんで
すみません、正確に申しますと、
「0000/00/00」と「0000/00/00 00:00」の形式が混ざっていると
いうことです。

未だ解決に至っておりません。
宜しくお願い致します。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-25 16:17
引用:

java初心者★さんの書き込み (2007-07-25 16:02) より:
>とりあえずTIMEの型ってなんでしょうか?
カラムODERTIMEの型はJAVA上で作成しましたString型です。



DB上での型を聞いているのでは?
CREATE TABLEするときにカラムの型を指定するでしょう?アレです。
DBの型とJavaの型は別物ですよ。

引用:

java初心者★さんの書き込み (2007-07-24 17:24) より:
データを再度確認したのですが、

確かに2007/04/01〜2007/07/01まで、
この形式で格納されておりました。


このあたりの発言をみてもちょっと誤解しているんじゃないかなと。
「ツールを使って表示したときにそう表示される」ってのと
「実際に格納されているデータ」というのは違います。ここ、重要。

日付型のデータをツールがyyyy/mm/ddに変換して表示しているのだとしたら、
一見して日付型のデータと文字列型のデータが一緒のように見えるのですね。
だから、「型はなんですか?」と問われているのです。
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2007-07-25 17:15
引用:

java初心者★さんの書き込み (2007-07-25 16:02) より:

>データの時間があったりなかったりと
>いうのは Oracle の DATE 型ではあり得ないんで
すみません、正確に申しますと、
「0000/00/00」と「0000/00/00 00:00」の形式が混ざっていると
いうことです。




nagise さんに補足していただきましたが、データベース上のデータ型のつもりでした。

それからどこまで意識されているか分かりませんが、"yyyy/mm/dd" の日付書式では、時間は暗黙的に 00:00:00 として扱われます。
2007/04/01〜2007/07/01 であれば "2007/04/01 00:00:00" 〜 "2007/07/01 00:00:00" の範囲のデータがヒットしますが、"2007/07/01 00:00:01" 以降はヒットしません。

* どうでもいいですがもしかして OTN でも質問挙げられてます?

さらにどうでもいいですが、データを取ってきた結果に "yyyy/mm/dd" というのと "yy/mm/dd hh:mi:ss" が混在しているということであれば、データベース上のデータ型は DATE ってことはありえません(プログラムの中でわざわざ変えているのだとしたら話は別ですが)。
あと、その CSE とかいうツールがそもそもお使いのバージョンの Oracle に対応しているのか、という点も疑問です (*)(なので SQL*Plus でどうなのか確認して欲しいんですけど)。

_________________
もしもし@RMAN 友の会

[ メッセージ編集済み 編集者: もしもし 編集日時 2007-07-25 17:24 ]
java初心者
ベテラン
会議室デビュー日: 2007/07/23
投稿数: 54
投稿日時: 2007-07-25 17:57
もしもし様

ありがとうございます。

>どうでもいいですがもしかして OTN でも質問挙げられてます?
こちらのサイトしか利用しておりませんです。

SQL*Plusでも一緒でした…。

スキルアップ/キャリアアップ(JOB@IT)