|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.02.2012, 20:44 | #1 |
Пользователь
Регистрация: 07.11.2011
Сообщений: 67
|
Функция DateDiff
Доброго времени суток, помогите пожалуйста вычислить стаж работы с помощью функции:
DateDiff («interval»; «date1»; «date2»; «firstweekday»; «firstweek») Два аргумента понятны: = DateDiff («interval»; [ДатаНайма]; [ДатаУволнения]; «firstweekday»; «firstweek») Как заполнить остальные три аргумента? |
14.02.2012, 01:52 | #2 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
Здравствуйте raytek.
О функции DateDiff (как и о других функциях VBA) можно узнать в справке MS Office. Syntax DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) четвертый и пятый аргументы - опциональны (не обязательны - указываются в квадратных скобках), функции передаются: номер первого дня недели(по умолчанию воскресенье) и первая неделя года (по умолчанию неделя в которой 1 января). Первый аргумент: строка указывающая интервал вычисления: yyyy Year q Quarter m Month y Day of year d Day w Weekday ww Week h Hour n Minute s Second проверить все аргументы можно подобной конструкцией: Код:
= DateDiff ("yyyy"; [ДатаНайма]; [ДатаУволнения]) Успехов Вам. Евгений. |
14.02.2012, 09:06 | #3 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Teslenko_EA
Евгений, браво! отличный пост! только я хочу хочу предостеречь автора темы от одного нюанса работы функции DateDiff она по сути возвращает разницу Год(ВтораяДата)- Год(ПерваяДата) т.е. Код:
с 31.12.2011 до 1.1.2012 по мнению DateDiff прошёл 1 (один) год. c 01.01.2011 до 31.12.2011 по мнению DateDiff прошло 0 (ноль) лет. для вычисления полного возраста в годах или вычисления стажа использование этой функции не очень корректно. p.s. на форуме приводились решения с формулой, которая, конечно, на порядок массивнее, но зато выдаёт более адекватные (на мой взгляд) результаты... |
14.02.2012, 18:36 | #4 |
Участник клуба
Регистрация: 10.08.2009
Сообщений: 1,796
|
to Serge_Bliznykov.
Здравствуйте Сергей. "..формулой, которая, конечно, на порядок массивнее.." - не согласен. Не все формулы громоздки, например : ([ДатаНайма]-[ДатаУволнения])/362,25 Такая конструкция не заслуживает названия "массивная", но автор просил именно "..с помощью функции : DateDiff...." Евгений. |
15.02.2012, 00:17 | #5 |
Пользователь
Регистрация: 07.11.2011
Сообщений: 67
|
Огромное всем спасибо, опробую оба варианта. Я сначала тупо применил
([ДатаУвольнения]-[ДатаНайма]) и формат yy Оказалось если стаж больше 10 лет все хорошо показывает 2 цифры, а если меньше то вместо допустим 05 показывает 1905. Я в справку MS Office там все на English, я в свою толстенную книгу по Access, нашел DateDiff но без описания аргументов.... Я так понял что 4 и 5 аргументы для нашего летоисчисления должны быть такие = DateDiff ("yyyy"; [ДатаНайма]; [ДатаУволнения];2;1) 2 - неделя начинается с понедельника 1 - неделя где есть 1 января, если это по умолчанию то можно наверно и так = DateDiff ("yyyy"; [ДатаНайма]; [ДатаУволнения];2) Я все правильно понял? |
15.02.2012, 08:39 | #6 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
а даты - они же целые числа. по данной формуле с 01.03.2010 по 01.03.2011 прошло 0.999315537 лет.. Округлять нельзя (т.к. тогда по 2x февраля пройдёт один год) если интересно, то, чтобы не потворяться, я бы рекомендовал сходить в тему: Подсчет возраста (к слову, там же есть моё замечание-предостережение насчёт использования DateDiff: смотрите в указанной теме мой пост #5) ну и подобные вопросы ещё обсуждались в разных темах.. например, тут - Вычисление возраста в MS Access p.s. впрочем, мы с Вами впадаем в рекурсию. из той темы, что я указал выше: Цитата:
Последний раз редактировалось Serge_Bliznykov; 15.02.2012 в 08:43. |
||
15.02.2012, 21:24 | #7 |
Пользователь
Регистрация: 07.11.2011
Сообщений: 67
|
После целого дня тестов остановился на следующих формулах:
1) Возраст =Fix(([Уволен]-[Принят]+1)/365,25) 2) Стаж работы =IIf([Уволен]>"0";(Fix(([Уволен]-[Принят]+1)/365,25));(Fix((Date()-[Принят]+1)/365,25))) Вроде все работает как надо, что скажите? Одного не понял в ответе Serge_Bliznykov - Округлять нельзя (т.к. тогда по 2x февраля пройдёт один год).... |
16.02.2012, 10:35 | #8 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
я имел в виду случаи, как, например, дата приём на работу 1.03.2011 дата увольнения: 29.02.2012 по формуле получается 1 ПОЛНЫЙ год. ну и любые другие аналогичного плана: дата приём на работу 10.04.2010 дата увольнения: 09.04.2012 по формуле получается 2 ПОЛНЫХ года. ну и т.д. по приведённым датам Вы легко поймете, когда возникает подобный небольшой косячок (конечная дата выбрана "хитро" - если взять конечную дату днём раньше или днём позже, то никакого косяка наблюдаться не будет — будет возвращаться правильное значение). я думаю, что в 99.99% случаев подобным нюансом можно и пренебречь. (а если нельзя пренебречь - смотри более сложную формулу, которая ВСЕГДА даёт точный и правильный ответ) |
|
16.02.2012, 20:40 | #9 |
Пользователь
Регистрация: 07.11.2011
Сообщений: 67
|
Спасибо за науку, 99.99% - это хороший процент
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
DATEDIFF | Claster | SQL, базы данных | 6 | 30.08.2011 08:43 |
Функция | Xenta | Microsoft Office Excel | 2 | 31.01.2011 19:54 |
Функция | timyr1997 | Общие вопросы Delphi | 3 | 05.07.2010 08:58 |
функции convert, datediff | Veroonya | БД в Delphi | 8 | 09.02.2009 11:13 |
одна функция потока, а другая функция - член класса запускающего этот поток | Дмитрий_Ч | Общие вопросы C/C++ | 2 | 27.09.2007 08:50 |