Небольшие величины имеют значение. Представьте, что вы экономите (или разумно расходуете) всего 1 секунду за каждый час. Всего одна секунда! В этом случае за все время вашей жизни вы сэкономите или потратите разумно (1 сек в час * 24 часа в сутки * 365 дней в году * 100 лет) / (3600 секунд в час * 24 часа в день) = 10 дней — целый отпуск на две недели!

Хотя сравнение усечение и округления может показаться незначительным, накопительный эффект может быть очень большим, будь то усечение или округление десятичных чисел или значений времени SAS, представленных ниже.

Из предыдущей статьи Усечение десятичных чисел в SAS без округления мы знаем, что такие форматы SAS как w.d, DOLLARw.d и COMMAw.d не обрезают десятичные числа, а округляют их.

Однако форматы времени SAS несколько отличаются Давайте рассмотрим пример.

Предположим, что у нас есть значение времени SAS '09:35:57't. В качестве напоминания скажу, что значение времени SAS — это значение, представляющее количество секунд с полуночи текущего дня. Значения времени SAS находятся между 0 и 86400.

Формат TIMEw.d

Давайте применим формат TIMEw.d к нашему значению времени и посмотрим на результат.

Запустим следующий код SAS:

data _null_;
	t = '09:35:57't;
	put t= time5.;
	put t= time2.;
run;

Мы получим следующий результат:

t=9:35
t=9

Это означает, что этот формат обрезает секунды и минуты. И наоборот, если бы округление происходило, мы бы получили следующий результат:

t=9:36
t=10

Формат HHMMw.d

Давайте запустим тот же код SAS с форматом HHMMw.d:

data _null_;
	t = '09:35:57't;
	put t= hhmm5.;
	put t= hhmm2.;
run;

Результат будет таким:

t=9:36
t=9

Что это означает? Это означает, что формат HHMMw.d округляет секунды (в случае усечения мы должны были получить t=9:35), но обрезает минуты (в случае округления мы должны были получить t=10, т.к. 35 минут ближе к 10, чем к 9). Немного непоследовательно, по крайней мере, для наших целей.

Усечение значений времени SAS

Это небольшое исследование показывает, что из двух форматов, TIMEw.d и HHMMw.d, лучше всего использовать формат TIMEw.d с целью усечения значения времени SAS как для минут, так и для секунд.

Независимо от используемого формата вы также можете обрезать значение времени вычислительным способом перед применением формата. Для этого необходимо вычесть остаток от этого значения на 60 (для усечения секунд) или на 3600 (для усечения минут). Например, запустим следующий код:

data _null_;
	t = '09:35:57't;
	t_m = t - mod(t,60);
	t_h = t - mod(t,3600);
	put t= hhmm5.;
	put t_m= hhmm5.;
	put t_h= hhmm5.;
run;

Результат будет таким:

t=9:36
t_m=9:35
t_h=9:00

Округление значений времени SAS

Теперь когда мы изучили методы усечения времени с помощью вычислений и с помощью формата TIMEw.d, пора перейти к округлению. Если формат является последовательным, мы можем использовать его функции усечения с целью округления. Для этого мы можем увеличить первоначальное значение времени на 30 (60/2 секунд) для округления секунд и на 1800 (3600/2 секунд) для округления минут. После этого усечение полученного значения будет эквивалентно округлению исходного значения.

Давайте запустим следующий код SAS:

data _null_;
	t = '09:35:57't;
	t_m = t + 60/2;
	t_h = t + 3600/2;
	put t_m= time5.;
	put t_h= time2.;
run;

Результат будет таким:

t_m=9:36
t_h=10

Это означает, что наше исходное значение времени  '09:35:57't было округлено как для секунд, так и для минут.

Теперь вы знаете, как обрезать и как округлить значения времени SAS. И не забывайте о своих двухнедельных каникулах, экономя всего секунду каждый час. А если вы сможете экономить 2 секунды, то получите целый месяц отпуска.

P.S. Наш читатель Эрик Тиланус предложил довольно эффективное использование функции ROUND: для округления минут — round(time, 60) и для округления часов — round(time, 3600), как в следующем примере:

data _null_;
	t = '09:35:57't;
	t_m = round(t,60);
	t_h = round(t,3600);
	put t_m= time5.;
	put t_h= time2.;
run;

Опять же, в результате мы получим округленные значения:

t_m=9:36
t_h=10

Функцию ROUND можно использовать и другим способом  — для округления дробных временных интервалов.

Оригинал статьи на английском