2016-09-12 1 views
-1

以下のOracle SQLクエリがあります。以下の日付に適切な日付関数を使用したいです。これはOracle SQLクエリのハードコードです

ここ
select p_name, 
     cal_vale, 
     St_val, 
     l_date 
from pr_tab 
where L_date = to_date('03-sep-16','dd-mon-yy'); 

03-Sep-16データベースから先週の土曜日のデータをキャプチャするために、ハードコーディングされた日付値です。

このハードコードされた値を今後使用したくないです。最後の土曜日のデータをデータベースから取得するプロセスを自動化するために、Oracleの組み込み関数が必要です。

+0

あなたの質問は不明です。 –

+1

sysdateとnext_dayはすでに日付であるため、TO_DATE(...、 'DD-MON-YY')は不要です –

+0

質問のフレーミング 以下のOracle SQLクエリがあります。 pr_tabからのp_name、cal_vale、l_dateの選択 L_date = to_date('03 -sep-16 '、' dd-mon-yy '); ここで、03-Sep-16は、最後の土曜日のデータをデータベースから取得するための、ハードコードされた日付の値です。 このハードコーディングされた値を使用するのではなく、最後の土曜日のデータをデータベースから取得するこのプロセスを自動化するOracle SQL関数を使用したいと考えています。 – user1917985

答えて

1

曜日を指定する日付書式指定子 'D'(1から7まで)で始まります。 1つの問題は、Oracleが返すものはNLS_TERRITORYの設定に依存するため、日曜日、月曜日(または土曜日も考えています)になる可能性があります。

北米と同様に、値1は日曜日を表しているとします。例えば

、木曜日、TO_NUMBER(TO_CHAR(SYSDATE、 'D'))上の任意の曜日のための最後の土曜日の日付5.

sysdate - to_number(to_char(sysdate, 'D'))リターンを返します。

これは、NLS_TERRITORY設定に従って、曜日(1)の最初の日が日曜日である場合にのみ機能します。例えば

1は月曜日を表す場合、その後、先週の土曜日はsysdate - to_number(to_char(sysdate, 'D'))-1

より良いアプローチは、ハードコードに、クエリでNLS_DATE_LANGUAGE設定です、そして日が一日名前からのオフセットを取得:

select case to_char (sysdate, 'FmDay', 'nls_date_language=english') 
      when 'Monday' then 2 
      when 'Tuesday' then 3 
      when 'Wednesday' then 4 
      when 'Thursday' then 5 
      when 'Friday' then 6 
      when 'Saturday' then 7 
      when 'Sunday' then 1 
     end d 
    from dual 

ので

sysdate -case to_char (sysdate, 'FmDay', 'nls_date_language=english') 
       when 'Monday' then 2 
       when 'Tuesday' then 3 
       when 'Wednesday' then 4 
       when 'Thursday' then 5 
       when 'Friday' then 6 
       when 'Saturday' then 7 
       when 'Sunday' then 1 
      end 

は確実にあなたのための最後の土曜日の日付を与えますNLSの設定にかかわらず、任意の曜日。

+0

助けてくれたおかげでトニー。これを試してみてください – user1917985

+0

問題がなければ、答えが出たら承認してください。 –

+0

こんにちはトニー、それは私のクエリで最後の土曜日のデータを取得するために働いています:)助けをもう一度ありがとう – user1917985

2

あなたは機能NEXT_DAY()を使用することができます。

SELECT NEXT_DAY(TRUNC(SYSDATE) - INTERVAL '8' DAY, 'SATURDAY') 
FROM DUAL; 

(注:あなたが7日から次土曜日を見つけた場合は、今日はそれから、土曜日だった場合は、前から8日から次土曜日を見つける必要がありますあなたは今日に戻るでしょう。)

+0

あなたの応答のためにあなたの応答をありがとうございます。次の日((sysdate)-7、 'SAT')FROM DUAL;また私のために働く。 – user1917985

+0

@ user1917985今日が土曜日の場合、NEXT_DAY(SYSDATE - 7、 'SATURDAY')は今日の土曜日ではなく、最後の土曜日では返されません。 – MT0

関連する問題