2016-04-07 15 views
0

特定の日付を選択するためのクエリを作成しました。今日の日付に基づいて四半期の日付を選択するクエリ

最初の月曜日、つまり四半期終了後の最初の月曜日にクエリを実行すると、先月の日付全体が選択されます。

他の月曜日にクエリを実行すると、現在の四半期のデータが今日の日付まで選択されます。

私がしようとしたクエリを以下に示します。

SELECT 
CASE 
WHEN Q.GL_PERIOD_NUMBER IN (1,4,7,10,12) AND Q.DAY_NAME='MONDAY' AND Q.MONTHEND_FLAG='Y' THEN 'FULL_QUARTER' 
WHEN Q.GL_PERIOD_NUMBER IN (2,3,5,6,8,9,11) AND Q.DAY_NAME='MONDAY' AND Q.MONTHEND_FLAG='N' THEN 'PARTIAL QUARTER' 
ELSE 'NO RUN' 
END RUN 
FROM 
(SELECT A.GL_MONTHEND_FLAG MONTHEND_FLAG, B.DAY_NAME DAY_NAME , B.gl_period_number GL_PERIOD_NUMBER 
FROM 
(SELECT TRIM(GL_MONTHEND_FLAG) GL_MONTHEND_FLAG 
FROM RSE.RSE_CD_D_CALENDAR WHERE TRUNC(CALENDAR_DATE)=TRUNC(SYSDATE-12)) A, 
(SELECT TRIM(DAY_NAME) DAY_NAME, gl_period_number GL_PERIOD_NUMBER 
FROM RSE.RSE_CD_D_CALENDAR WHERE TRUNC(CALENDAR_DATE)=TRUNC(SYSDATE-10)) B) Q; 

私は条件を考え出したが、私は、日付を選択するための構文を設計することができませんよ。

誰かがヒントを得たら助けになるだろう!続き

は、テーブル構造である:

desc RSE_CD_D_CALENDAR 
Name      Null Type    
------------------------- ---- ----------------- 
CALENDAR_DATE     DATE    
DATE_REFERENCE     VARCHAR2(10 CHAR) 
GL_DAYEND_COMPLETE_FLAG  VARCHAR2(1 CHAR) 
DAY_OF_WEEK     NUMBER    
DAY_NAME      VARCHAR2(15 CHAR) 
DAY_NUMBER      NUMBER    
DW_PROCESSING_WEEK_ID   NUMBER    
DW_FISCAL_WEEK_ID    NUMBER    
CALENDAR_WEEK_NUMBER   NUMBER    
GL_WEEK_NUMBER     NUMBER    
GL_WEEKEND_FLAG    VARCHAR2(1 CHAR) 
GL_WEEKEND_COMPLETE_FLAG  VARCHAR2(1 CHAR) 
DW_MONTH_ID     NUMBER    
GL_PERIOD      VARCHAR2(6 CHAR) 
GL_PERIOD_NUMBER    NUMBER    
MONTH_SHORT_NAME    VARCHAR2(3 CHAR) 
MONTH_LONG_NAME    VARCHAR2(15 CHAR) 
GL_PERIOD_KEY     NUMBER    
GL_MONTHEND_FLAG    VARCHAR2(1 CHAR) 
GL_MONTHEND_COMPLETE_FLAG  VARCHAR2(1 CHAR) 

DW_QTR_ID      NUMBER    
QTR_NUMBER      NUMBER    
GL_QTR_END_FLAG    VARCHAR2(1 CHAR) 
GL_QTR_END_COMPLETE_FLAG  VARCHAR2(1 CHAR) 
GL_YEAR      NUMBER    
GL_YEAREND_FLAG    VARCHAR2(1 CHAR) 
GL_YEAREND_COMPLETE_FLAG  VARCHAR2(1 CHAR) 
MANUAL_ADJ_COMPLETE_FLAG  VARCHAR2(1 CHAR) 
PROCESSING_WEEK_RELATIVE  NUMBER    
FISCAL_WEEK_RELATIVE   NUMBER    
MONTH_RELATIVE     NUMBER    
QTR_RELATIVE     NUMBER    
YEAR_RELATIVE     NUMBER    
CALENDAR_MONTH_NUMBER   NUMBER    
CALENDAR_MONTH_SHORT_NAME  VARCHAR2(4000)  
BILLING_DAY_FLAG    VARCHAR2(1)  
QUARTER_NAME     VARCHAR2(6)  
DW_CALENDAR_MONTH_ID   NUMBER    
CALENDAR_MONTH_RELATIVE  NUMBER    
CALCULATION_DATE    DATE    
BILLING_DAY_USA    NUMBER    
BILLING_DAY     NUMBER    

相対的なフィールドは、現在および0のために存在している-1、-2、それぞれの前の数ヶ月の数週間など

+0

テーブルの構造を投稿して、質問からmysqlタグを削除することを検討してください。 –

答えて

2

私はこのアプローチで行くだろうと思います:

with quarter_start_dt as (
select 
case when trunc(sysdate-7, 'Q') = trunc(sysdate, 'Q') then -- current quarter 
trunc(sysdate, 'Q') 
when trunc(sysdate-7, 'Q') <> trunc(sysdate, 'Q') then -- previous quarter 
trunc(sysdate-7, 'Q') 
end qs_dt 
from dual) 
select * from table, quarter_start_dt where 
condition_dt >= qs_dt; 

は、さらに私は推測する、それは前四半期のためにあなたは、後に行わ何かをカットする四半期の終了日を選択して、追加の条件としてそれを使用したいのですが四半期終了日。

EDIT: "with"クエリは境界日 - qs_dt(四半期開始日)を選択するために使用されます。 trunc(date、 'Q')は四半期の日付の開始点を返しますので、一週間前と同じか別の四半期であるかどうかをチェックしています - 同じ四半期の場合は現在の四半期の開始日を境界日として使いますif週前の四半期の開始日は異なっていました。新しい四半期の開始日であり、前四半期の開始日を境界日として使用したいと考えています。 次に、クエリを取ってください(これは簡単な選択で読みやすくしています)、where句の四半期の開始日としてqs_dtを使用します。

希望します。

関連する問題