Oracle SQL データベース上で動作する Business Objects を使用しています。PL やあらゆる種類の SQL コマンド ラインへのアクセス権がなく、データベースへの書き込みアクセス権もありません。クエリは単一のコマンドとしてのみ実行でき、定義された一連の列を出力する必要があります。
SQL に次のように表示されるユーザー プロンプトからデータを取得できます。
@variable('Prompt1')
たとえば、次のように言えます。
SELECT
A.SomeDate
FROM
A
WHERE
A.SomeDate BETWEEN @variable('Start') AND @variable('End Date')
これは簡単です。実行されます。ユーザーにいくつかの日付を入力するように要求します。そして、それらの間にあるすべての一致を返します (包括的)。
ただし、問題は、ユーザーが Business Objects の「Infoview」システムを使用してクエリを実行し、プロンプト システムが日付ピッカーを表示することです。これには、デフォルトで日付の時刻部分 (「01/01/2016 12 :00:00 AM")。
ユーザーが時間部分を削除しないと、SomeDate 値が選択した時間外になると、レコードが失われる可能性があります。たとえば、TODAY のすべてのレコードを取得する場合、技術的には 00:00:00 (真夜中) から 23:59:59 までのすべてのレコードが必要です。
私が本当にできるようにしたいのは、次のように、クエリ変数の周りに TRUNC を使用することです。
WHERE
A.SomeDate BETWEEN TRUNC(@variable('Start')) AND TRUNC(@variable('End Date'))
...ただし、これによりコンパイルエラーが発生します:「矛盾したデータ型: 予想される DATE は NUMBER を取得しました」。コンパイルする前に Oracle がプロンプトを数値データ型として扱う理由がわかりません。
@variable 値を取得して、日付値に切り捨てることができるものに変換する方法を知っている人はいますか?
したがって、私はこれを回避する方法を見つけようとしています。私が念頭に置いていたことの 1 つは、TO_DATE を使用して、prompt 変数を明示的に日付に変換できるかどうかでした。
編集:「12:00:00 AM」はすでに真夜中であるため、TRUNCは効果がないことが指摘されています。したがって、TRUNCを誤解していると思います。真夜中に切り捨てられているようです: 日付の時刻部分を完全に削除しただけだと思っていましたが、00:00:00 から 23:59:59 までの任意の時刻に一致が返されることを意味します。
私が本当に欲しいのは、たとえば SomeDate に 11:03 の時間部分がある場合、End Date プロンプトがその日のみを指定しているときに、これが確実に含まれるようにするにはどうすればよいかということです。