2016-01-08 3 views
2

Я часто использую функцию day для управления параметрами даты в запросах.Функции даты SAS: Квартальная эквивалентная функция дня

С шагом данных ниже я могу назвать начало текущего месяца &bom в зависимости от того или нет дня месяца le до 8 числа каждого месяца (в котором тот случае, мы хотим &bom набора к 1 в предыдущем месяце), в противном случае устанавливается &bom до 1-го числа текущего месяца.

data _null_; 
call symput('current'," '" || put(intnx('day',today(),0),yymmdd10.) || "'"); 
call symput('bom'," '" || put(intnx('month',today(),0,'b'),yymmdd10.) || "'"); 
call symput('end'," '" || put(intnx('day',today(),-8,'e'),yymmdd10.) || "'"); 
if day(today()) le 8 then do; 
call symput('bom'," '" || put(intnx('month',today(),-1,'b'),yymmdd10.) || "'"); 
end; 
run; 

%put &bom &end &current; 

262 %put &bom &end &current; 
'2015-12-01' '2015-12-30' '2016-01-07' 

Казалось бы, просто применить эту логику к условию «квартального типа». Таким образом, если (последовательный) день квартала составляет менее 8 дней после последнего дня квартала, то значение вашего &boq (начало квартала) будет первым днем ​​квартала LAST '2015-10-01', но функция qtr создает значения на основе на квартал 1-4, а не «число», представляющее собой последовательный день квартала.

Есть функция, которая может работать с количеством дней на ежеквартальном уровне, подобно функции day, работающей на ежемесячном уровне?

Моя первая попытка была оберточной функции ... никакого успеха ...

qtr_day = day(qtr(today())); 

ответ

4

Трюк не использовать дату SAS, поскольку даты SAS являются номера, так что вы можете найти границу дату и добавить/вычесть 8 по желанию для увеличения. Или вы можете вложить intnx-функции в дату. Чтобы отображать дату в виде четверти, используйте четверть формата для отображения даты.

date_qtr_boundary = intnx('quarter', today(), 0, 'e') + 8; 

Тогда вы можете сравнить даты, чтобы граничное значение, а не число 8. Я с трудом следуя именно то, что вы хотите, чтобы определить, но если вы разместите некоторые выборочные данные и ожидаемый результат, я (или кто-то еще) может предоставить более подробную информацию.

+0

Я думаю, что вы понимаете мою концепцию. Позволяет использовать сегодняшнюю дату (8-е), чтобы уточнить/подтвердить. Поскольку это <= до 8-го числа квартала, мне нужно создать mac. вар. & boq для представления первого дня предыдущего квартала ('2015-10-01'), но если я буду выполнять работу завтра (9-е), мне нужно ее создать mac. вар. & boq в первый день текущего квартала ('2016-01-01'). Я считаю, что вы дали мне решение, уточнив дату, когда произошла граница четверти (начало или конец), и отключение от этого: правильно? – SMW

+1

'DATA _NULL_; CALL SYMPUT ('BOQ', '' '|| PUT (INTNX (' QUARTER ', TODAY(), 0,' B '), YYMMDD10.) || "'"); IF TODAY() <= INTNX ('QUARTER', TODAY(), 0, 'E') + 8 THEN DO; \t CALL SYMPUT ('BOQ', '' '|| PUT (INTNX (' QUARTER ', TODAY(), - 1,' B '), YYMMDD10.) || "'"); END; RUN; % PUT &BOQ; 'Казалось, что это трюк (производящий значение« 2015-10-01 »). – SMW

+0

Рад, что у вас есть! – Reeza

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