- PR -

Oracle日付型の検索

1
投稿者投稿内容
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2006-10-09 14:00
いつもお世話になっています。

VB.NET2003、ADO.NETで開発を行っています。

Form上のDateTimePickerとOracleの日付型を検索しています。
to_char関数で検索はできているのですが、
パフォーマンスを考えて、to_date関数に変更したいのですが、
うまくいきません。

コード:
・to_char関数
where to_char(年月日,'yyyymmdd') = '" & Format(CDate(Me.DateTimePicker1.Text), "yyyyMMdd") & "'



コード:
・to_date関数
where to_char(年月日,'yyyymmdd') = #" & CDate(Me.DateTimePicker1.Text) & "#
文字が無効です。というエラーメッセージが出てしまいます。



どなたかご教授お願いします。
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-10-09 15:22
モンジさん こんちには。

引用:

モンジさんの書き込み (2006-10-09 14:00) より:
パフォーマンスを考えて、to_date関数に変更したいのですが、
うまくいきません。

コード:

・to_date関数
where to_char(年月日,'yyyymmdd') = #" & CDate(Me.DateTimePicker1.Text) & "#
文字が無効です。というエラーメッセージが出てしまいます。






TO_DATE 関数を使用している部分が見当たりませんが、
これは記載間違いだとして

WHERE 列名 = TO_DATE(日付,書式)
とすればできると思います。

[ メッセージ編集済み 編集者: ダッチ 編集日時 2006-10-09 15:36 ]
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2006-10-09 17:14
ダッチさん、レスありがとうございます。

引用:

TO_DATE 関数を使用している部分が見当たりませんが、
これは記載間違いだとして



おっしゃるとおり、記述間違いです。

to_date関数を調べると、『文字列を日付に変換する』関数でしたが、
年月日は日付けなので、
コード:
where 年月日 = #" & CDate(Me.DateTimePicker1.Text) & "#


としましたが、やはり『文字が無効です』というエラーメッセージが出てしまいます。

因みにクラスのメソッドとしてSQLをstringで引数にしていまして、
その中身は、"where 年月日 = #2006/10/04#"となっています。
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2006-10-09 17:31
ダッチさんがおっしゃるとおり

>> WHERE 列名 = TO_DATE(日付,書式)

とすべきだと思うのですが

>> where 年月日 = #" & CDate(Me.DateTimePicker1.Text) & "#

では、だめですよね
まずSQLをStringの引数にしているのであればCDateは必要ないです。
また、CDateの値を#で括っているようですが、Oracleでは無用だと思います。(この記述はAccess?)

例ですが
strSQL = "WHERE 年月日 = TO_DATE('" & Me.DateTimePicker1.Text & "', 'YYYY/MM/DD')"
とすべきではないでしょうか?
'YYYY/MM/DD'の書式はDateTimePickerの書式とあわせる必要があります。

_________________
--------------------------------------------
HIRO's.NET VB.NETとC#のTipsを掲載しています

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-10-09 18:03 ]

[ メッセージ編集済み 編集者: HIRO 編集日時 2006-10-09 18:04 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-10-09 21:10
パフォーマンスを考えるなら「年月日」に対して関数を使ったらダメかな。
うろ覚えですが、TO_DATE('2006/10/09', 'YYYY/MM/DD') は
2006/10/09 00:00:00 になったような。。。

日付を検索したいなら between などで範囲を指定して検索したほうがいいと思います。

[ メッセージ編集済み 編集者: かるあ 編集日時 2006-10-09 21:13 ]
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-10-09 21:54
引用:

モンジさんの書き込み (2006-10-09 17:14) より:

to_date関数を調べると、『文字列を日付に変換する』関数でしたが、
年月日は日付けなので、
コード:
where 年月日 = #" & CDate(Me.DateTimePicker1.Text) & "#


としましたが、やはり『文字が無効です』というエラーメッセージが出てしまいます。

因みにクラスのメソッドとしてSQLをstringで引数にしていまして、
その中身は、"where 年月日 = #2006/10/04#"となっています。



TO_DATE の『文字列を日付に変換する』を誤解されているのだと思います。

Me.DateTimePicker1.Text は文字列です。
CDate(文字列) はプログラム上の日付型に変換するものです。
SQL では CDate を使用してもただの文字列として扱われます。

そのため、SQL 上で日付型として認識させるために TO_DATE 関数があります。

"where 年月日 = #2006/10/04#"
この例で言うと 「#2006/10/04#」はただの文字列として SQL が認識します。
年月日の日付型と #2006/10/04# の文字列を比較しているのでエラーが発生したのでしょう。
そこで TO_DATE 関数の出番です。

HIROさんの例で
引用:

strSQL = "WHERE 年月日 = TO_DATE('" & Me.DateTimePicker1.Text & "', 'YYYY/MM/DD')"
とすべきではないでしょうか?



とすれば、Me.DateTimePicker1.Text に入っている日付の文字列が
SQL で日付型と認識してくれます。
認識した結果 「2006/10/04」の文字列が

かるあさんのおっしゃるとおり
引用:

TO_DATE('2006/10/09', 'YYYY/MM/DD') は
2006/10/09 00:00:00 になったような。。。



となります。

最終的には
WHERE 日付型の年月日 = 日付型の 2006/10/09 00:00:00
として比較され SQL は年月日が「2006/10/09 00:00:00」のを検索するようになります。
モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2006-10-16 12:28
ダッチさん、かるあさん、HIROさん

返事が遅れまして、大変申し訳ありません。
先週からずっとなのですが、明日までエラーコードを実行できる環境にありませんので、18日に再度報告させていただきます。取り急ぎご連絡まで。

ダッチさん、丁寧なご解説ありがとうございました。CDateとTo_Dateの違い・使い方が非常によくわかりました。

かるあさん、To_Dateを使用した場合、時刻まで注意しなければならないというご指摘ありがとうございます。18日に実際DBに入っているデータを見て、00:00:00以外があれば、betweenでの処理にTryしてみます。

HIROさん、#で囲むご指摘ありがとうございます。私は昨年までずっとaccessを使っていまして、今もプログラミングこそVB.NETで行っておりますが、簡単なPGMのDBにはaccessを使用しておりまして、大変勉強になりました。

モンジ
ベテラン
会議室デビュー日: 2005/09/06
投稿数: 85
投稿日時: 2006-10-23 10:09
皆様、返事が遅くなりまして申し訳ございません。

無事解決いたしました。

実データは00:00:00以外の時刻もありましたので、
betweenで対応しました。
1

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