Исследуем Функции datediff, Dateadd, DatePart,DateSerial,DateValue
Исследуем функции дат
Родилось благодаря вопросу про датедифф от Ирины.
Родилось благодаря вопросу про датедифф от Ирины. Public Sub date_diff() 'Исследуем Функции datediff, Dateadd, datepart, 'dateserial, datevalue 'datediff(исследуемый_интервал,начальная дата,конечная 'дата,какой первый день 'недели ,первая неделя года содержит 1 января) 'Загвоздка работы в том, что datediff по разному ' "чувствует" тот диапазон,что собирается вычислить. ' Эту чувствительность задает 'параметр исследуемый_интервал. Если мы дадим найти 'диапазон лет ("уууу") 'то он будет считать вхождение лет 'Пример на понимание. Диапазон 22-апр-1999 по 1-янв-2000 'Всем видно что там разница меньше года. НО!!!! 'В диапазоне "лет" datediff посчитает так:
' дате дифф посчитал 1 год 'Внимание товарищи!!!! Есть повод выпить!!!!!! 'Прошло два дня!!!! 'А уже год!!!! VBA для алкоголиков написан!!!!!!! 'УРА товарищи. 'Думаю не стоит утруждать мыслями, что чувствительность 'Зависит от параметра исследуемый_интервал. ' пример Для вычисления диапазона месяцы ("m")
Debug.Print DateDiff("m", DateValue("1 - мая - 1999"), _ DateValue("1 - июня - 1999"), _ vbWednesday,vbFirstJan1)
'Это 1 месяц, к сожалению как и следующая разница то же
Debug.Print DateDiff("m", DateValue("31 - мая - 1999"), _ DateValue("1 - июня - 1999"), _ vbWednesday,vbFirstJan1)
'да, да. Это тоже 1 месяц (июнь.1999 - май.1999 = 6-5=1) 'Для вычисления диапазона недели("w" или "ww") есть 'четкое указание firstdayofweek (какой первый день 'недели) - тоже влияет на вычисление и так далее. 'И все таки. Как нам вычислить диапазон правильно 'Используя Якобы неправильную функцию 'вывод один - проверять самих себя!!!! 'Но я бы делал так: 'есть такая функция как dateparth - удобно для всяких 'сервисов.Показывает часть от целого.
'в этой строке < это решение, основанное на том, что 'логическое значение True соответствует арифметическому 'значению -1, а логическое значение False - 'значению 0. Функция прибавляет к разнице лет -1 или 0, 'что зависит от заданной даты рождения. (этот пример и 'комментарий привел ДиД) 'Жалко только что такой вариант не пояснит что человеку 'не 14 , а 14.5 лет например. 'на это каждый лох способен..... да, но не каждый поймет 'что эта величина зависит еще и от высокосности года. 'Зная все это можно написать функцию вычисления дробной части даты в 1 строке
'сделаем
'Значится ТОВАРИЩИ датадифф с оговорками. 'Задача: Человек работал с 1 мая 2000 по 31 мая 2001. 'Дураку ясно что это 13 месяцев. ' но не vba
Debug.Print DateDiff("m", DateValue("1 - мая - 2000"), _ DateValue("31 - мая - 2001"), vbWednesday, vbFirstJan1)
' видно что это 12 ' а если так
Debug.Print DateDiff("m", DateValue("1 - мая - 2000"), _ DateValue("31 - мая - 2001"), vbWednesday, vbFirstJan1) Debug.Print DatePart("D", _ DateValue("31 - мая - 2001")) / DatePart("D", _ DateValue("31 - мая - 2001")) - (DatePart("D", _ DateValue("1 - мая - 2000"))) / DatePart("D", _ DateValue("31 - Мая - 2000"))
' Получилось что человек отработал 12 + 0,967742 'месяцев. Округляя по 4 после запятой получили 13 мес 'дотошный человек скажет. что мол числа удобно подобрал. 'А если так например. 'Человек работал с 30 апреля 2000 по 1 апреля 2001. 'Дураку ясно что это 11 месяцев.
Debug.Print DateDiff("m", _ DateValue("30 - апреля - 2000"), _ DateValue("1 - апреля - 2001"), vbWednesday, vbFirstJan1) ' видно что это 12 ' а если так
Debug.Print DateDiff("m", _ DateValue("30 - апреля - 2000"), _ DateValue("1 - апреля - 2001"), vbWednesday, _ vbFirstJan1) - DatePart("D", _ DateValue("30 - апреля - 2000"))/DatePart("D", _ DateValue("30 - апреля - 2000"))+DatePart("D", _ DateValue("1 - апреля - 2001"))/DatePart("D", _ DateValue("30 - апреля - 2001"))
' Получилось что человек отработал 11,0333333333333 'месяцев. Округляя по 4 после запятой получили 11 мес 'Используя именно эту формулу мы учтем еще и наличие 'высокосных дней(29.02) ' хотя можно и упростить деля просто на 30(среднее 'количество дней в месяце)или так 365 12 = 30
Debug.Print DateDiff("m", _ DateValue("30 - апреля - 1999"), _ DateValue("12 - декабря - 2001"), _ vbWednesday, vbFirstJan1)
' видно что это 32 'А на самом деле
Debug.Print DateDiff("m", _ DateValue("30 - апреля - 1999"), _ DateValue("12 - декабря - 2001"), vbWednesday, vbFirstJan1) - _ DatePart("D", DateValue("30 - апреля - 2000"))/30 _ + DatePart("D", DateValue("12 - декабря - 2001"))/30 '31,4 месяца 'У меня все. Если есть притензии, то не ко мне. а к 'верности формул. Я хотелпривести идею. End Sub