Oracle SQLデータベースの上で実行されるBusiness Objectsを使用しています。私はPLやあらゆる種類のSQLコマンドラインにアクセスすることができず、データベースへの書き込みアクセス権も持っていません。私は単一のコマンドとしてクエリを実行することができ、定義された列のセットを出力する必要があります。Oracle 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までのすべてのレコードが必要です。
WHERE
A.SomeDate BETWEEN TRUNC(@variable('Start')) AND TRUNC(@variable('End Date'))
が...しかし、これはコンパイルエラーが発生します:次のように私は本当に行うことができるようにしたいと思い何
は、クエリ変数の周りに使用TRUNCある「一貫性のないデータ型:予想DATEは、NUMBERを得ました"オラクルがコンパイルする前にプロンプトを数値データ型として扱う理由はわかりません。
@variable値をどのように取って、それを日付値に切り捨てることができるか知っている人はいますか?
私はこれを回避する方法を見つけようとしています。私が覚えていたことは、プロンプト変数をとり、TO_DATEを使って明示的に日付に変換できるかどうかということでした。
編集:TRUNCは効果がないと私は指摘されています。 00:00 AM "はすでに深夜です。だから私はTRUNCを誤解していると思う。真夜中に切り捨てられているように見えますが、日付の時間部分を単に削除すると思っていましたが、00:00:00から23:59:59までの間はいつでも一致が返されます。
私が本当に欲しいのは、SomeDateには11:03などの時間部分がある場合、End Dateプロンプトでその日のみを指定すると、これが確実に含まれるようにする方法はありますか?
日付ピッカーが常に時刻を午前12:00:00としている場合、切り捨てると効果はありません。それはすでに深夜になっています。 –
@Alex Poole - うーん、興味深いです。 SomeDateの値に実際に時間の部分がある場合(11:02など)、私は上記の例を単純化しましたが、実際には日付を見たいと思っています。たとえば、11時02分の予定を含め、今日行われているすべての予定を一覧表示する場合は、「真夜中」検索では選択されません。切り詰めると時間部分が検索されなかったということになります。 –
Oracleの日付には常に時間がありますが、削除することはできません。深夜に設定するだけです。これはtruncのデフォルト設定です。開始日の00:00:00と終了日の23:59:59の間でレコードを一致させたいのですか? –