web-dev-qa-db-ja.com

OracleはDATEにLIKE '%'を使用します

テーブルmyTabには列startDateがあり、データ型は「DATE」です。この列のデータは、dd.mm.yyyyのように格納されます。

今、私はこのクエリでデータを取得しようとしています:

SELECT * FROM myTab WHERE startDate like '%01.2015"

どういうわけかそれは機能しません、そして私はなぜかわかりません。

誰かが助けてくれることを願っています。

8
Mihawk

日付でテキスト検索を行うには、日付をテキストに変換する必要があります。

検索したいものの最初と最後の日付を計算し、それらの間のすべてを取得すると、より効率的です。そうすることで、テキストパターンマッチではなく数値比較として行われ、インデックスがある場合はそれを利用できます。

SELECT * FROM myTab WHERE startDate >= DATE '2015-01-01' AND startDate < DATE '2015-02-01'
19
Guffa
SELECT * FROM myTab WHERE TO_CHAR(startDate,'dd.mm.yyyy') LIKE '%01.2015'
2
tib

フィールドタイプが「DATE」の場合、値は文字列として保存されず、Oracleが管理する数値であるため、文字列に変換する必要があります。

SELECT * FROM myTab WHERE to_char(startDate, 'MM.YYYY') = '01.2015';

SQLクエリで日付範囲を使用することもできます。

SELECT * FROM myTab 
WHERE startDate 
BETWEEN to_date('01.01.2015', 'DD.MM.YYYY') 
AND     to_date('31.01.2015', 'DD.MM.YYYY');
2
mbk

あなたの実際の質問に関して、「どういうわけかそれはうまくいかず、なぜなのか分かりません。」

OracleはDATEからVARHCAR2への暗黙的な変換を行いますが、デフォルトのNLS_DATE_FORMATを使用しますが、これはおそらくクエリで使用するものとは異なります。

1

この列のデータは、dd.mm.yyyyのように格納されます。

Oracleは、表示されている形式で日付を保存しません。これは、内部的に独自の形式で7バイトで格納され、各バイトには日時値のさまざまなコンポーネントが格納されます。

「%01.2015」のようなWHERE startDate

[〜#〜]日付[〜#〜][〜#〜]文字列を比較しています[〜#〜]、これは無意味です。

パフォーマンスの観点から、日付範囲条件を使用する必要があります日付列に通常の[〜#〜] index [〜#〜]がある場合、それが使用されます。

SELECT * FROM table_name WHERE date_column BETWEEN DATE '2015-01-01' AND DATE '2015-02-01'

日付範囲条件パフォーマンスの点で優れている理由を理解するには、私の答えを見てください ここ

1
Lalit Kumar B

より詳細な回答を提供し、これに対処するには https://stackoverflow.com/a/42429550/1267661 回答の問題。

Oracleでは、タイプ「日付」の列は数値でも文字列でもありません。年、月、日、時、分、秒を含む「日時」値です。デフォルトの時刻は常に午前0時の「00:00:00」です。

クエリ:

Select * From bdPedidos Where Data Like '%" + data + "%'" 

日付列は文字列ではないため、すべての状況で機能するわけではありません。「like」を使用すると、Oracleは日付値から文字列値への変換を強制的に実行します。文字列値はyear-month-day-timeまたはmonth-day-year-timeまたはday-month-year-timeである可能性があり、それらはすべて、特定のOracleインスタンスがパラメータNLS_DATE_FORMATを設定して日付を文字列として表示する方法に依存します。

1日のすべての可能な時間をカバーする正しい方法は次のとおりです。

Select * 
From bdPedidos 
Where Data between to_date('" + data + " 00:00:00','yyyy-mm-dd hh24:mi:ss')
               and to_date('" + data + " 23:59:59','yyyy-mm-dd hh24:mi:ss')
0
alvalongo

私はその方法で問題を解決しました。改善のための提案をありがとう。 C#の例。

string dd, mm, aa, trc, data;
dd = nData.Text.Substring(0, 2);
mm = nData.Text.Substring(3, 2);
aa = nData.Text.Substring(6, 4);
trc = "-";
data = aa + trc + mm + trc + dd;

"Select * From bdPedidos Where Data Like '%" + data + "%'";
0