Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Date Diff считает неправильно / 21 сообщений из 21, страница 1 из 1
19.09.2019, 17:52
    #39864132
OkeTurel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Привет всем.

Строю запрос, пишу в бланке: ИмяПоля: DateDiff("yyyy";#07.10.2017#;#19.09.2019#). Возвращает 2 года, хотя надо - 1 год.
Пробую вместо # написать ". То же самое.
Пробую через VBA, функцией age = DateDiff("yyyy", d_s, d_f). Замечу, что d_s и d_f - тип Variant. Возвращает 2 года.
Подумала, может, тип Variant ему не нравится. Пробую использовать функцию CDate. Возвращает 2 года.

Я что-то делаю неверно?
...
Рейтинг: 0 / 0
19.09.2019, 18:29
    #39864160
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
OkeTurel,
Очередное наступание на грабли
считайте интервал в днях, а уже потом,определяйте сколько это лет,месяцев,дней
...
Рейтинг: 0 / 0
19.09.2019, 18:34
    #39864165
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
OkeTurelПривет всем.

Строю запрос, пишу в бланке: ИмяПоля: DateDiff("yyyy";#07.10.2017#;#19.09.2019#). Возвращает 2 года, хотя надо - 1 год.
Пробую вместо # написать ". То же самое.
Пробую через VBA, функцией age = DateDiff("yyyy", d_s, d_f). Замечу, что d_s и d_f - тип Variant. Возвращает 2 года.
Подумала, может, тип Variant ему не нравится. Пробую использовать функцию CDate. Возвращает 2 года.

Я что-то делаю неверно?

Вы делаете всё верно, только функция сама округляет до полного года, к примеру если разница составляет 1 год и один месяц функция по умолчанию округлит до полного года, то есть выведет 2 года.

Именно в вашем контексте решить проблему очень просто:
ИмяПоля: (DateDiff("yyyy";#07.10.2017#;#19.09.2019#)-1)
...
Рейтинг: 0 / 0
19.09.2019, 20:31
    #39864217
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
OkeTurel,

Вы хотите получить число полных лет между датами?
Вот так можно:
Код: vbnet
1.
DateDiff(""yyyy"", Date1, Date2) + (Format(Date2, ""mmdd"") < Format(Date1, ""mmdd""))
...
Рейтинг: 0 / 0
19.09.2019, 20:39
    #39864223
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Надо сравнивать еще месяц и день
Код: vbnet
1.
DateDiff("yyyy",d_s, d_f) + (format(d_s,"mmdd") > format(d_f,"mmdd"))
...
Рейтинг: 0 / 0
19.09.2019, 20:43
    #39864226
__Michelle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Только уберите двойные кавычки.
Просто я вытащила фрагмент из текстовой строки (там двойные были нужны) и не поправила.
...
Рейтинг: 0 / 0
19.09.2019, 23:16
    #39864284
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Извечная проблема:продолжительность месяца реально 28,29,30 и 31 день
Во многих руководящих документах определена продолжительность года-365 дней и месяца-30 дней. При подсчете стажа с годами и месяцами проблем не возникает а вот дни.... Расчет использующий разность между датами в днях даст результат отличный от "вычитания столбиком"(которым обычно пользуются кадровики). Разрешение этого противоречия-главная проблема
...
Рейтинг: 0 / 0
20.09.2019, 08:14
    #39864363
OkeTurel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Доброе утро.

Да, нужно получить число полных лет между датами - это возраст человека в годах.

Спасибо большое, милые друзья, сколько хороших советов вы мне дали. Сейчас буду разбираться с каждым советом и пробовать.
...
Рейтинг: 0 / 0
20.09.2019, 10:07
    #39864415
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Ещё вариант - форматировать в YYYYMMDD, вычесть, поделить на 10000 и взять целое.

PS. Все эти способы дадут неверные данные для того, кто родился 29 февраля, если текущая дата - 28 февраля невисокосного года.
...
Рейтинг: 0 / 0
20.09.2019, 10:22
    #39864428
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Akina....PS. Все эти способы дадут неверные данные для того, кто родился 29 февраля, если текущая дата - 28 февраля невисокосного года.
Не все так просто как кажется!(Козьма прутков)
Для получения верного результата надо учитывать количество високосных годов между двумя датами,количество дней в текущем году...
...
Рейтинг: 0 / 0
20.09.2019, 14:38
    #39864656
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Лучше изучайте документацию.
Функция Diff даёт не чистую разницу по заданному интервалу, а количество переходов между определяемыми значениями.
Т.е. между 07.10.2017 и 19.09.2019 два перехода по значению ГОД с 2017 на 2018 и с 2018 на 2019
Так же если вы попробуете узнать разницу в месяцах между 31.07.2019 и 1.08.2019 по значению МЕСЯЦ, то функция Diff Вам выдаст 1, хотя разница всего 1 день. Но был осуществлён переход с июля на август.

Проблему вычислить интервал между датами обычно решают разными самописными функциями
...
Рейтинг: 0 / 0
10.10.2019, 12:16
    #39874503
OkeTurel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Joss, спасибо за пояснения. Хотя непонятно, какую практическую ценность имеет информация о количестве переходов между значениями. Кому понадобится вычислять количество переходов? Видимо, этой функцией пользуются редко. :)
...
Рейтинг: 0 / 0
05.12.2019, 14:53
    #39898622
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Привет всем еще раз, не хочу плодить дополнительный топик.

Столкнулся примерно с такой же проблемой. Как верно посчитать разницу дат в месяцах.
К примеру 04.12.2019 и 02.02.2020 по задаче должно выводить три месяца, а не два, как выводит по умолчанию функция datediff.
Есть дикая конструкция на несколько строк, но это не тру.
Как правильно и коротко правильно посчитать количество месяцев в разнице дат, подскажите плиз.
Имеем в виду, что даже если у нас конечная дата 01.01.2020 или 02.02.2020 , то этот огрызок дней идет как дополнительный месяц.
...
Рейтинг: 0 / 0
05.12.2019, 15:17
    #39898647
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Если раскладывать на пальцах задачу:
К примеру

дата_начала_договора: 04.12.2019
дата_окончания_договора: 02.02.2020

В заданном промежутке времени присутствует три месяца - декабрь,январь,февраль.
На выходе должно быть число: 3

Самописную VBA функцию использовать не хочу, так как это нужно сделать на уровне запроса. Если пихать вбашную функцию в запрос, то потом возникают проблемы с фильтрацией и сортировкой такого запроса при увеличении записей. Этот вариант не подходит.
...
Рейтинг: 0 / 0
05.12.2019, 16:13
    #39898701
ИВП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Сергей Лалов,
описываю словами вычисляемое поле (лень функции писать)

месяц_конечной_даты - месяц_начальной_даты + 1 +
+(год_конечной_даты - год_начальной_даты) * 12
...
Рейтинг: 0 / 0
05.12.2019, 16:21
    #39898705
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Сергей Лалов
К примеру

дата_начала_договора: 04.12.2019
дата_окончания_договора: 02.02.2020

В заданном промежутке времени присутствует три месяца - декабрь,январь,февраль.
На выходе должно быть число: 3
То есть ежели начато 31 января и окончено 1 февраля, то результат 2 месяца. хотя период 2 дня? Точно? уж больно как-то странно...
...
Рейтинг: 0 / 0
05.12.2019, 16:36
    #39898721
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Akina,
да именно так, количество используемых месяцев в периоде, нужно ,согласно условию задачи. Не зарплату считаем и не стаж . Нужно именно поголовный расчет количества разных месяцев в указанном периоде. Я уже решил проблемку своим вариантом. Проверил все возможные хитрые даты типа високосных годов и прочие западни.

Ну вот мое в копилку если что:
Код: sql
1.
IIf(Day([дата_начала_договора])=Day([дата_окончания_договора]);DateDiff("m";[дата_начала_договора];[дата_окончания_договора]);DateDiff("m";[дата_начала_договора];[дата_окончания_договора])+1)



PS. ИВП, спасибо и за ваш вариант, буду иметь в виду. Итого на руках два рабочих варианта.
...
Рейтинг: 0 / 0
05.12.2019, 18:42
    #39898807
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Сергей Лалов
в копилку если что
Только там проверка не на равенство нужна, а на больше либо равно (*или меньше либо равно? думать лень...).
...
Рейтинг: 0 / 0
05.12.2019, 18:50
    #39898810
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Akina,
не, нормально отрабатывает, (больше или меньше - обратите внимание что сравниваем там Day , ну то есть фактически числа от одного до 7 , что в одном случае,что во втором) обсчитывается во второй части IIF, то есть отсекает. Если больше (или меньше), это автоматом попадает во второй блок вычисления IIF. Хитрость Datediff в том,что Datediff даёт не чистую разницу по заданному интервалу, а количество переходов между определяемыми значениями , Joss чуть выше написал об этом.
Нормально работает, верно. Единственно что надо запретить пользователю вводить даты окончания договора меньше даты начала договора, но это технически уже либо в условии на значение,либо на форме проверку сделаю.
...
Рейтинг: 0 / 0
05.12.2019, 19:01
    #39898818
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Сергей Лалов
нормально отрабатывает


Гм... вроде для всех трёх записей должно быть два (ноябрь да декабрь), не?
...
Рейтинг: 0 / 0
05.12.2019, 19:05
    #39898820
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Date Diff считает неправильно
Akina,
не берите в голову, это частный случай моей задачи, да, если дни совпадают, то надо ставить один период. Самое главное ,что нужное получил. В моем случае это верный ответ.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Date Diff считает неправильно / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]