5

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 プロンプトがその日のみを指定しているときに、これが確実に含まれるようにするにはどうすればよいかということです。

4

3 に答える 3

1

Start の 00:00:00 と End の 23:59:59 の間の値を一致させたい場合SomeDateは、デフォルトの午前 0 時ではなくその時刻になるように終了日を調整するか、または の代わりに範囲を使用できますbetween

WHERE
    A.SomeDate >= @variable('Start')
AND
    A.SomeDate < @variable('End Date') + 1

Oracle の日付演算+ 1を使用して変数値の翌日を示します。そのため、ユーザーが開始日と終了日の両方に「01/01/2016 12:00:00 AM」を選択した場合、2016-01-01 00 と評価されます。 :00:00 と 2016-01-02 00:00:00 です。必要に応じて構文を使用できます。interval

上限に未満を使用する、開始日 2016-01-01 00:00:00以上で、調整済み終了日 2016-01-02 00:00:00未満SomeDateのすべてのレコードが取得されます。 - これは、2016-01-01 23:59:59 までと言っているのと同じです。(または、23:59:59.999 までの 1 秒未満の精度を持つタイムスタンプ列がある場合...)。

パーサーが変数が文字列であると想定しているが、実際には日付であり、「データ型が一致していません」というエラーが発生する場合は、パーサーを満たすために日付にキャストできます。

WHERE
    A.SomeDate >= CAST(@variable('Start') AS DATE)
AND
    A.SomeDate < CAST(@variable('End Date') AS DATE) + 1

または、実際に示した形式の文字列として渡される場合は、明示的に変換できます。

WHERE
    A.SomeDate >= TO_DATE(@variable('Start'), 'DD/MM/YYYY HH:MI:SS AM')
AND
    A.SomeDate < TO_DATE(@variable('End Date'), 'DD/MM/YYYY HH:MI:SS AM') + 1

...正しい形式であることを確認します。あなたの例では、DD/MM/YYYY または MM/DD/YYYY の可能性があります。

于 2016-08-17T14:27:04.717 に答える
1

TO_CHAR()と をTO_DATE()一緒に使ってみてください:

WHERE
A.SomeDate > TO_DATE(TO_CHAR(@variable('Prompt1'),'ddmmyyyy'),'ddmmyyyy')
于 2016-08-17T13:58:20.567 に答える