2017-01-26 32 views
1

月曜日に実行されたときに金曜日からデータを取得するクエリを作成したいとします。別の曜日である場合は、前日のデータを取得する必要があります。金曜日のデータを月曜日に取得する

Select sum(od.shippedqty) as SHIPPEDQTY 
from orderdetail od, orders o 
Where o.orderkey = od.orderkey 
and to_char(o.actualshipdate, 'YYYYMMDD') = to_char(sysdate, 'YYYYMMDD') -1 

私はケースの機能とウェブ上で発見のヒントのすべての種類で何かをしようとしましたが、私は取得する管理していませんでした:私は月曜日を除いて完璧に動作し、このクエリを、作成した時点では それは機能する。 誰が私を助けることができます。

+0

は金曜日(あなたのcase文)のための作業をご提示ください。 – Hari

答えて

4

このクエリがあなたのために[OK]を動作する場合は、単に非常にそれと

- case to_char(sysdate, 'Dy') when 'Mon' then 3 else 1 end 

で終わりで-1を変更するには、言った - どのように文字列から1を引いていますか? Oracleはその文字列を数値に変換しますが、これは日付として正しく機能しません。むしろ

... and o.actualshipdate >= trunc(sysdate) - <expression from above> 
    and o.actualshipdate < trunc(sysdate) - <expression from above> + 1 

actualshipdateのインデックスの使用を可能にするので、これは、左側にtruncを使用してtrunc(sysdate)に比べより優れている(そこでなければならないように、一方が存在すると仮定するとこのようなクエリを頻繁に実行する場合)。

:下記のMT0のコメントを参照してください(ありがとう、MT0!)。もちろん、彼は正しい。非英語圏ロケールでクエリを使用すると問題が発生する可能性があります。 where句への私の提案された変更でさえ、case表現では、全体としてはまだto_char()です。あなたが使用することができます

to_char(sysdate, 'Dy', 'nls_date_language = English') 
+1

'TO_CHAR()'の3番目の引数として明示的に 'NLS_DATE_LANGUAGE'を定義する必要があるかもしれません。そうしないと、異なるロケールで予期しない結果が得られるかもしれません。 – MT0

+0

@ MT0 - もちろん。私はその旨のメモを追加した。 – mathguy

+0

クエリは次のように作成されます。SHIPPEDQTYとしてsum(od.shippedqty)を選択します。 from orderdetail od、orders o o.orderkey = od.orderkey およびo.actualshipdate> = trunc(sysdate) - case to_char(sysdate、 Dy ')' Mon 'then 3 else 1 end とo.actualshipdate

1

:それは次のように記述する必要があります

CASE TRUNC(your_date) - TRUNC(your_date, 'IW') 
    WHEN 0 THEN your_date - INTERVAL '3' DAY -- Monday 
    WHEN 6 THEN your_date - INTERVAL '2' DAY -- Sunday 
     ELSE your_date - INTERVAL '1' DAY -- Tuesday - Saturday 
END AS previous_workday 
+0

@mathguy。クエリはエラーなしで実行されています。正しいデータが生成されるかどうかを月曜日に確認する必要があります。 –

+0

@MartijnDrohm - それはあなたが考えるものです。 2月1日にそれを実行してみてください。右側は '' 20170201 ' - 1'(20170200)です。比較は失敗し、返される行はありません。 – mathguy

+0

@ MT0 - OPは土曜日や日曜日ではなく平日にクエリを実行しているようですので、おそらくそれは必要ありません。また、オラクルは*言語*を一重引用符で囲みますが、厳密に言えば、そこにはいけません。 – mathguy

関連する問題