2016-04-07 2 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: Запрос «с» используется для выбора даты окончания - qs_dt (дата начала четверти). trunc (date, 'Q') возвращает начало четвертой даты, поэтому я проверяю, был ли это тот же или другой квартал недели назад - если это тот же самый квартал, то используйте дату начала текущего квартала в качестве граничной даты, если неделю назад дата начала квартала была иной, это означает, что это начало нового квартала, и вы хотите использовать начало предыдущего квартала как дату окончания. Затем возьмите свой запрос (который я заменил простым выбором для удобочитаемости) и используйте qs_dt в качестве даты начала квартала в предложении where.

Надеюсь, это поможет.

Смежные вопросы