テーブルmyTab
には列startDate
があり、データ型は「DATE」です。この列のデータは、dd.mm.yyyy
のように格納されます。
今、私はこのクエリでデータを取得しようとしています:
SELECT * FROM myTab WHERE startDate like '%01.2015"
どういうわけかそれは機能しません、そして私はなぜかわかりません。
誰かが助けてくれることを願っています。
日付でテキスト検索を行うには、日付をテキストに変換する必要があります。
検索したいものの最初と最後の日付を計算し、それらの間のすべてを取得すると、より効率的です。そうすることで、テキストパターンマッチではなく数値比較として行われ、インデックスがある場合はそれを利用できます。
SELECT * FROM myTab WHERE startDate >= DATE '2015-01-01' AND startDate < DATE '2015-02-01'
SELECT * FROM myTab WHERE TO_CHAR(startDate,'dd.mm.yyyy') LIKE '%01.2015'
フィールドタイプが「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');
あなたの実際の質問に関して、「どういうわけかそれはうまくいかず、なぜなのか分かりません。」
OracleはDATE
からVARHCAR2
への暗黙的な変換を行いますが、デフォルトのNLS_DATE_FORMAT
を使用しますが、これはおそらくクエリで使用するものとは異なります。
この列のデータは、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'
日付範囲条件がパフォーマンスの点で優れている理由を理解するには、私の答えを見てください ここ 。
より詳細な回答を提供し、これに対処するには 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')
私はその方法で問題を解決しました。改善のための提案をありがとう。 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 + "%'";