2017-08-09 1 views
-1

2つの日付(過去4週間)と午後2時から午前12時の間に結果を返すクエリがあります。 火曜日のみ返すようフィルタリングする方法はありますか?火曜日にのみSQLを返します

select * 
from monitor_files 
where trfr_type in ('FTE', 'SFTP') 
     AND CREATE_TIME >= TO_TIMESTAMP('20170718 140000', 'YYYYMMDD HH24:MI:SS') 
     AND CREATE_TIME < TO_TIMESTAMP('20170819 000000', 'YYYYMMDD HH24:MI:SS') 
     AND TRFR_STATUS ='C' AND to_char(create_time, 'dy') = 'tue' 
     AND extract(hour from CAST(create_time as timestamp)) BETWEEN 14 AND 23 

ありがとう:

SELECT * 
    FROM monitor_files 
    WHERE trfr_type IN ('FTE', 'SFTP') 
      AND create_time >= To_timestamp('20170718 140000', 'YYYYMMDD HH24:MI:SS') 
      AND create_time < To_timestamp('20170819 000000', 'YYYYMMDD HH24:MI:SS') 
      AND trfr_status = 'C' 

この1

は(感謝キーズJard)私のために働きました。

+0

To_timestamp()はOracleの組み込み関数です。 SQL Serverでこれを実行すると、To_timestamp 'は認識された組み込み関数名ではありません –

+0

いいえ、@ OLIVER.KOOです。 OPでは、同様の方法でDAY_OF_WEEKでEXTRACTを使用できるはずです。 https://docs.oracle.com/cd/E37483_01/server.751/es_eql/src/ceql_functions_date_extract.html –

+0

そして、私は上記クエリが真夜中以降の時間を与えることに気付きました。午後2時から真夜中までしか欲しくありません。 – user1034127

答えて

1

単に一般的to_char(create_time, 'd') = 3to_char(create_time, 'dy') = 'tue'でどこ

to_char(create_time,'d') = 3 
+0

このクエリの結果は、現在のユーザーセッションのNls_TERRITORY設定によって異なります。 –

1

where句述語以下を追加します。

AND to_char(create_time, 'dy') = 'tue' 
AND extract(hour from CAST(create_time as timestamp)) BETWEEN 14 AND 23 

私の知る限りでは、Oracleに知っているように、抽出物は、曜日を取得するために使用することはできません。それはまた、日付時間型の時間を取得するために使用することはできません、それはタイムスタンプのような別の型でなければなりません - あなたのcreate_timeがタイムスタンプならば、キャストを省略することができます。

https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm#SQLRF00639

+0

このクエリの結果は、現在のユーザーセッションのNls_Date_LANGUAGE設定によって異なります。 –

+0

WDは良い点です。インストールターゲットの言語に合わせて「tue」という言葉を変える必要があるかもしれません。あなたのシステムが複数のロケールにインストールされている場合は、 'tue'をto_char(to_date( '19700106'、 'yyyymmdd')、 'dy'など)に置き換える必要があります。 1970年1月6日 –

+0

より良いアプローチは、nlsparamパラメータを使用することだと思います。https://docs.oracle.com/database/121/SQLRF/functions216.htm#SQLRF06129 –

0

に追加作業が、彼らは現在のユーザーセッションのNLS設定に依存しています。

to_char(..., 'd')返信平日。ただし、最初の平日はNLS_TERRITORYに依存しています。たとえば、アメリカでは週の第1日は日曜日ですが、ヨーロッパでは週の第1日が月曜日です。アラビア文化では、土曜日は通常、週の最初の日と見なされます。だから、あなたがチェック/ to_char(..., 'd')NLS_TERRITORY結果が決定されていない設定しない限り、例を参照してください。

alter session set nls_territory = 'america'; 
select to_char(sysdate,'d') from dual; 

TO_CHAR(SYSDATE,'D') 
6 

alter session set nls_territory = 'germany'; 
select to_char(sysdate,'d') from dual; 

TO_CHAR(SYSDATE,'D') 
5 

同じことがto_char(..., 'dy')に適用されます。 NLS_DATE_LANGUAGEが設定されていない値はNLS_TERRITORYから導出されたときに、

alter session set nls_date_language = 'american'; 
select to_char(sysdate-3,'day') from dual; 

TO_CHAR(SYSDATE-3,'DAY') 
tuesday 

alter session set nls_date_language = 'french'; 
select to_char(sysdate-3,'day') from dual; 

TO_CHAR(SYSDATE-3,'DAY') 
mardi 

NLS_DATE_LANGUAGEから独立するためには、あなたが

to_char(create_time,'dy', 'NLS_DATE_LANGUAGE = american') = 'tue' 

注意を使用する必要があります。私はNLS_DATE_LANGUAGEに依存し、例を参照してください。 NLS_TERRITORYが設定されていない場合、値はNLS_LANGから派生します。Setting Up a Globalization Support Environment

関連する問題