2016-04-07 10 views
0

Ich habe eine Abfrage geschrieben, um ein bestimmtes Datum auszuwählen.Abfrage, um vollständige Quartalstermine basierend auf dem heutigen Datum auszuwählen

Wenn ich die Abfrage am ersten steuerlichen Montag, d. H. Ersten Montag nach Quartalsende, führe, sollte sie die gesamten Daten des vorherigen Monats auswählen.

Wenn ich die Abfrage an einem anderen Montag ausführen, dann sollte es die Daten für das aktuelle Viertel bis zum heutigen Datum auswählen.

Es folgt die Abfrage, die ich versucht habe:

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; 

ich die Bedingungen herausgefunden habe, aber ich bin nicht in der Lage Syntax zu entwerfen für Termine auswählen.

Es würde mir helfen, wenn jemand einen Hinweis geben könnte!

Es folgt Tabellenstruktur:

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    

Die relativen Felder vorhanden sind für Strom und 0, -1, -2 für die jeweiligen Vormonaten Wochen usw.

+0

Bitte veröffentlichen Sie die Struktur Ihrer Tabellen und ziehen Sie in Betracht, das mysql-Tag aus Ihrer Frage zu entfernen. –

Antwort

2

Ich glaube, ich mit diesem Ansatz gehen würde :

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; 

zusätzlich denke ich, dass Vorquartals für Sie nach dem etwas getan, ausschneiden mögen, dass das Viertel Enddatum holen und sie als zusätzliche Bedingung verwenden, um Quartalsenddatum.

EDIT: Die "mit" Abfrage wird verwendet, um das Grenzdatum - qs_dt (Quartal Startdatum) auszuwählen. Trunc (Datum, 'Q') gibt den Beginn des Quartalsdatums zurück, also überprüfe ich, ob es vor einer Woche das gleiche oder ein anderes Quartal war - wenn es das gleiche Quartal ist, dann benutze das aktuelle Quartal als Grenzdatum Vor einer Woche war das Quartalstartdatum anders, es bedeutet, dass es ein Beginn des neuen Quartals ist und Sie den Beginn des vorherigen Quartals als Grenzdatum verwenden möchten. Dann nehmen Sie Ihre Abfrage (die ich mit einfachen aus Gründen der Lesbarkeit ersetzt) ​​und verwenden Sie qs_dt als viertel Startdatum in der Where-Klausel.

Ich hoffe, es hilft.

Verwandte Themen