Основы работы в Gnumeric
Календарные функции.
Календарные функции в Gnumeric находятся в категории "Дата/Время", всего таких функций более 30. Основными являются функции "разложения" даты на составляющие – выделения из даты номера дня в месяце (функция day()), номера месяца в году (month()) и года (year()) – и функция обратного преобразования date(year(),month(),day()), которая конструирует данные типа "дата" из номера года, месяца и дня.
Также часто используются функции автоматического определения дня недели (weekday()), текущей даты (today()) и текущего момента времени (now()).
Имеются также интересные (и полезные) функции преобразования дат – date2unix() и обратная ей unix2date(). Они выполняют преобразование даты в количество секунд, прошедших с начала "эры UNIX", и наоборот ("эра UNIX" началась в полночь 1 января 1970 года).
Для знакомства с основными календарными функциями рассмотрим следующую задачу. Дан список лиц, для которых известны фамилии, пол и даты рождения. Определить:
- День недели, на который приходится день рождения каждого человека в текущем году. Если день рождения приходится на выходные дни, вывести текст "УРА!", в остальных случаях вывести текст "УВЫ...".
- Возраст на настоящий момент.
- Дату выхода на пенсию для каждого человека.
Для этой задачи воспользуемся исходными данными (списком фамилий) из задачи про доходы и налоги. Пол установим в соответствии с фамилиями, даты рождения введем произвольно (как уже упоминалось, удобно вводить дату в виде 23/11/88, а программа приведет ее в нужный вид).
Для получения решения по пункту "a" необходимо проделать некоторые промежуточные вычисления. Сначала нужно для каждого лица сформировать дату рождения в текущем году на основании дня и месяца рождения, а также номера текущего года. Тогда первая формула (в ячейке D4 на рис. 2.56) будет иметь вид:
=DATE(YEAR(TODAY());MONTH(C4);DAY(C4))
Очевидно, что функция today() просто выдает текущую дату, а функция date() формирует дату из номера года, номера месяца и номера дня в месяце, определяемых соответственно, с помощью функций year(), month() и day(). Естественно, при желании вместо результатов работы функций можно использовать адреса ячеек, содержащих числа или просто числа. Соответственно, формула для окончательного результата по пункту "а" (в ячейке E4) будет иметь вид:
=IF(OR(WEEKDAY(D4;2)=6;WEEKDAY(D4:2)=7);"УРА!";"УВЫ...")
где функция weekday() вычисляет день недели для даты, указанной в первом аргументе. Второй аргумент функции weekday() определяет правила нумерации дней недели. В данном случае первый день недели соответствует понедельнику.
Для обработки всего списка просто копируем эти формулы вниз. Для получения решения по пункту "b" воспользуемся функцией вычисления разности дат – datedif(). Эта функция имеет три аргумента – начальную дату, конечную дату и строку-параметр, задающую единицы измерения разности. Значения параметра "y", "m" или "d" позволяют найти разность дат соответственно, в полных годах, полных месяцах и в днях. С учетом того, что возраст определяется в полных годах, запишем формулу для возраста в следующем виде:
=datedif(C4;TODAY();"y")
Для получения решения по пункту "c" снова нужно формировать даты, используя значения параметров возраста выхода на пенсию. Эти возрасты на момент написания книги составляют 60 лет для мужчин и 55 для женщин, однако они могут в любой момент измениться, поэтому конкретные числа в формулу записывать не будем. Дата выхода на пенсию формируется с использованием условия проверки пола. Итак, получаем формулу:
=IF(B4="М";DATE(YEAR(C4)+$G$1,MONTH(C4);DAY(C4));DATE(YEAR(C4)+$G$2;MONTH(C4);DAY(C4)))
Результирующая таблица показана на рис. 2.56.
Последний столбец (дата выхода на пенсию) приведен в формате "dd/mm/yyyy" для иллюстрации корректного выполнения вычислений.