Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 20:44   #1
raytek
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 67
По умолчанию Функция DateDiff

Доброго времени суток, помогите пожалуйста вычислить стаж работы с помощью функции:

DateDiff («interval»; «date1»; «date2»; «firstweekday»; «firstweek»)

Два аргумента понятны:

= DateDiff («interval»; [ДатаНайма]; [ДатаУволнения]; «firstweekday»; «firstweek»)

Как заполнить остальные три аргумента?
raytek вне форума Ответить с цитированием
Старый 14.02.2012, 01:52   #2
Teslenko_EA
Участник клуба
 
Регистрация: 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
проверить все аргументы можно подобной конструкцией:
Код:
Sub listDateDiff()
Dim v(), i%
v = Array("yyyy", "q", "m", "y", "d", "w", "ww", "h", "n", "s")
For i = LBound(v) To UBound(v)
    Debug.Print DateDiff(v(i), #1/14/1986#, Date)
Next
End Sub
В Вашем случае скорее всего так:
= DateDiff ("yyyy"; [ДатаНайма]; [ДатаУволнения])

Успехов Вам.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 14.02.2012, 09:06   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Teslenko_EA
Евгений, браво! отличный пост!

только я хочу хочу предостеречь автора темы от одного нюанса работы функции DateDiff
она по сути возвращает разницу Год(ВтораяДата)- Год(ПерваяДата)
т.е.
Код:
    Debug.Print DateDiff("yyyy", #12/31/2011#, #1/1/2012#)
    Debug.Print DateDiff("yyyy", #1/1/2011#, #12/31/2011#)
результат:
 1 
 0
поясню результаты:\
с 31.12.2011 до 1.1.2012 по мнению DateDiff прошёл 1 (один) год.
c 01.01.2011 до 31.12.2011 по мнению DateDiff прошло 0 (ноль) лет.

для вычисления полного возраста в годах или вычисления стажа использование этой функции не очень корректно.



p.s. на форуме приводились решения с формулой, которая, конечно, на порядок массивнее, но зато выдаёт более адекватные (на мой взгляд) результаты...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.02.2012, 18:36   #4
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

to Serge_Bliznykov.
Здравствуйте Сергей.
"..формулой, которая, конечно, на порядок массивнее.." - не согласен.
Не все формулы громоздки, например :
([ДатаНайма]-[ДатаУволнения])/362,25
Такая конструкция не заслуживает названия "массивная", но автор просил именно "..с помощью функции : DateDiff...."

Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 15.02.2012, 00:17   #5
raytek
Пользователь
 
Регистрация: 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)

Я все правильно понял?
raytek вне форума Ответить с цитированием
Старый 15.02.2012, 08:39   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Не все формулы громоздки, например :
([ДатаНайма]-[ДатаУволнения])/362,25
Такая конструкция не заслуживает названия "массивная", но автор просил именно "..с помощью функции : DateDiff...."
к сожалению, данная конструкция не даёт ТОЧНОГО ответа.
а даты - они же целые числа. по данной формуле с 01.03.2010 по 01.03.2011 прошло 0.999315537 лет.. Округлять нельзя (т.к. тогда по 2x февраля пройдёт один год)

если интересно, то, чтобы не потворяться,
я бы рекомендовал сходить в тему:
Подсчет возраста

(к слову, там же есть моё замечание-предостережение насчёт использования DateDiff: смотрите в указанной теме мой пост #5)

ну и подобные вопросы ещё обсуждались в разных темах..
например, тут - Вычисление возраста в MS Access



p.s. впрочем, мы с Вами впадаем в рекурсию.
из той темы, что я указал выше:
Цитата:
Сообщение от Teslenko_EA
Код:
SELECT (Date() - [DD]) /365,25 as Y ...
как на каждый товар есть свой покупатель, так и для каждой функции найдется применение.
суждение упрощенное но жизненное.
Евгений.
Согласен. на каждый товар есть свой покупатель. Вполне возможно, что для каких-то целей хватит и такой формулы!

Последний раз редактировалось Serge_Bliznykov; 15.02.2012 в 08:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.02.2012, 21:24   #7
raytek
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 67
По умолчанию

После целого дня тестов остановился на следующих формулах:

1) Возраст =Fix(([Уволен]-[Принят]+1)/365,25)

2) Стаж работы =IIf([Уволен]>"0";(Fix(([Уволен]-[Принят]+1)/365,25));(Fix((Date()-[Принят]+1)/365,25)))

Вроде все работает как надо, что скажите?

Одного не понял в ответе Serge_Bliznykov - Округлять нельзя (т.к. тогда по 2x февраля пройдёт один год)....
raytek вне форума Ответить с цитированием
Старый 16.02.2012, 10:35   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вроде все работает как надо, что скажите?

Одного не понял в ответе Serge_Bliznykov - Округлять нельзя (т.к. тогда по 2x февраля пройдёт один год)....
ну работает и хорошо.

я имел в виду случаи, как, например,
дата приём на работу 1.03.2011
дата увольнения: 29.02.2012
по формуле получается 1 ПОЛНЫЙ год.

ну и любые другие аналогичного плана:
дата приём на работу 10.04.2010
дата увольнения: 09.04.2012
по формуле получается 2 ПОЛНЫХ года.

ну и т.д. по приведённым датам Вы легко поймете, когда возникает подобный небольшой косячок (конечная дата выбрана "хитро" - если взять конечную дату днём раньше или днём позже, то никакого косяка наблюдаться не будет — будет возвращаться правильное значение).

я думаю, что в 99.99% случаев подобным нюансом можно и пренебречь.
(а если нельзя пренебречь - смотри более сложную формулу, которая ВСЕГДА даёт точный и правильный ответ)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.02.2012, 20:40   #9
raytek
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 67
По умолчанию

Спасибо за науку, 99.99% - это хороший процент
raytek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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