2012-06-26 3 views
0

Я хочу добавить 1 день к произвольной дате SAS. У меня есть следующий код, который работает, но мне интересно кастрированный баран есть встроенная поддержка для даты расчетов, как это:Расчет даты в SAS

proc fcmp outlib=whatever; 
function lastDayInYear(d); 
    if datdif(d,mdy(12,31,year(d)),'ACT/365')=0 then return(1); else return(0); 
endsub; 

function advanceDate(d); 
    if d=. then return(.); 
    if lastDayInYear(d) then 
     return(mdy(1,1,year(d)+1)); 
    else 
     return(datejul(juldate7(d)+1)); 
endsub; 
quit; 

ответ

7

Itzy прав ... просто добавить 1. Если вы хотите сделать более сложные вычисления даты вы можете использовать intnx() и intck() функции.

например.

data _null_; 
    tomorrow   = date() + 1; 
    same_day_next_month = intnx('month',date(),1,'same'); 
    first_day_next_week = intnx('week' ,date(),1,'beginning'); 
    last_day_of_year = intnx('year' ,date(),0,'end'); 

    put _all_; 
run; 
9

Даты только цифры, поэтому для продвижения на следующий день один, вы просто, гм, добавьте 1 .

Где именно вы нашли этот код? Говорите об использовании кувалды, чтобы взломать гайку ...

+0

Хотя сложение и вычитание чисел в SAS даты работы и должны продолжать работать в будущем, он использует тот факт, что SAS выбрала целое число, чтобы представить его внутри. Всегда нужно использовать INTNX для обработки даты. В маловероятном, но возможном случае, который SAS решит изменить, ваш код будет продолжать работать, если вы используете функцию, а не математические операции. –

+4

Это правда. SAS также может принять решение переключить все свои команды на Fino-Ugric за 300 лет, но я стараюсь не слишком беспокоиться об этом. – itzy

6

В SAS нет данных данных DATE или DATETIME, такие значения сохраняются как общий тип цифровых данных, где для даты: количество сохраненных представляет собой количество дней между датой представленный и 1 января 1960 года. Для даты и времени это похоже, сохраняется только количество секунд. Вы увидите это в коде ниже. Доступное для человека представление даты, времени и даты и времени достигается с помощью форматов даты/времени SAS. Для более подробного объяснения просто выполните поиск по датам SAS в Интернете и документации.

Назад к вопросу: добавьте один день к значению, представляющему DATE, просто выполните математическое дополнение: +1.

data _null_; 
    length mydate mydatetime 8; 
    mydate='1jan1960'd; 
    mydatetime='1jan1960:00:00:00'dt; 
    nextdate = mydate + 1; 
    nextminute = mydatetime + 60; 
    put mydate 8. +4 mydate yymmdds10.; 
    put nextdate 8. +4 nextdate yymmdds10.; 
    put mydatetime 12. +4 mydatetime datetime.; 
    put nextminute 12. +4 nextminute datetime.; 
run;