Консультация № 60012
24.10.2006, 11:21
0.00 руб.
0 3 3
У меня есть отношение с двумя полями типа дата, можно ли получить , в Access 2000, как нибудь запросом разницу между датами в виде кол-ва дней, месяцев, лет, часов, минут, секунд.
Например: Первое поле день рождения, второе когда человек впервые устроился на работу. Со скольки лет начал работать человек?

Обсуждение

Неизвестный
24.10.2006, 11:55
общий
это ответ
Здравствуйте, 2!
Функция datediff вычисляет промежуток времени между указанными второй и первой датами, другими словами она находит календарный интервал между двумя датами. Результатом будет целое число со знаком, являющееся разностью между указанными частями второй и первой даты (date2 - date1).

В следующем запросе используется дата, равная 30 ноября 1985 года, для подсчета числа дней между этой датой и датами публикации книг, находящимися в столбце pubdate:



select newdate = datediff(day, pubdate, "Nov 30 1985")

from titles



Для книги, опубликованной 21 октября 1985 года, в предыдущем запросе будет получено число 40, т.е. число дней между 21 октября и 30 ноября. В следующем запросе календарный интервал вычисляется в месяцах:



select interval = datediff(month, pubdate, "Nov 30 1985")

from titles



Этот запрос укажет интервал в 1 месяц для книг, опубликованных в октябре, и 5 месяцев для книг, опубликованных в июне. Если первый аргумент функции datediff является более поздней датой по сравнению со вторым, то результат будет отрицательным. Поскольку для двух книг в таблице titles по умолчанию в столбце pubdate была указана функция getdate, то для них в этом столбце будет указана дата создания базы данных pubs. По этой причине в предыдущих запросах для этих книг будут получены отрицательные результаты.

Если один или оба аргумента этой функции имеют тип smalldatetime, то в процессе ее выполнения они преобразуются к типу datetime, чтобы вычисление было более точным. Секунды и миллисекунды для этого типа автоматически устанавливаются равными нулю при вычислении временного интервала.
Неизвестный
24.10.2006, 17:02
общий
это ответ
Здравствуйте, DragonTusk!
Для вычисления разницы между двумя датами в MS Access присутствует функция DateDiff. Вот примеры из Help:
Expression
=DateDiff("d", [OrderDate], [ShippedDate]) - Displays the variance in days between the values of the OrderDate and ShippedDate fields.
=DateDiff("yyyy", [Birthday1], [Birthday2]) - Displays the variance in years between the values of the Birthday1 and Birthday2 fields.
=DateDiff("m", #12/24/2000#, #11/26/2000#) - Displays the variance in months between the two dates. The expression evaluates to -1, since the first date falls after the second date.
=DateDiff("yyyy", #12/31/2000#, #1/1/2001#) - Displays the variance in years between the two dates. The expression evaluates to 1, even though only a day has elapsed.

LagTime: DateDiff("d", [OrderDate], [ShippedDate]) - Displays in the LagTime field the number of days between the values of the OrderDate and ShippedDate fields.
YearsLapsed: DateDiff("yyyy", #12/31/2000#, #1/1/2001#) - Displays in the YearsLapsed field the number of years between the two dates.
Неизвестный
24.10.2006, 19:23
общий
это ответ
Здравствуйте, 2!

Для примера посмотрите ответы на вопрос 38282 и 40959.

Насчет часов, минут и секунд будет сложно - надо думать, но по остальным можно.

В базе создаем таблицу BASE с полями DNAC и DPOS типа даты,
заносим несколько значений и запускаем запрос из приложения ( проверен на реальных данных ) .
При определении количества месяцев вычитаем 1, если день окончания меньше дня начала.
Отдельно выведено целое количество лет и месяцев.
Количество дней получается разницей между начальной датой + количество лет + количество месяцев.
В связи с тем, что данный запрос разрабатывался для отдела кадров, последний день больше на 1 ( если человек принят на работу и уволен в один и тот же день, все равно он отработал 1 день, хотя если просто отнять даты то 0 ) . Для исправления достаточно заменить строку dateadd ( ‘d‘ , 1 , dpos ) на dpos.

С уважением.

Приложение:
SELECT dnac, dpos, dateadd(‘d‘,1,dpos) AS last_day, int(datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos)-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) )/12) AS god, (datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos) )-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) ) mod 12 AS mes, datediff(‘d‘, dateadd(‘m‘, (datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos) )-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) ) mod 12,dateadd(‘yyyy‘, int(datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos)-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) )/12) ,dnac) ) ,dateadd(‘d‘,1,dpos) ) AS dn, ( int(datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos)-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) )/12) & ‘ г ‘ & (datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos) )-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) ) mod 12 & ‘ мес ‘ & datediff(‘d‘, dateadd(‘m‘, (datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos) )-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) ) mod 12,dateadd(‘yyyy‘, int(datediff(‘m‘,dnac,dateadd(‘d‘,1,dpos)-iif(day(dnac)>day(dateadd(‘d‘,1,dpos) ),1,0) )/12) ,dnac) ) ,dateadd(‘d‘,1,dpos) ) & ‘ дн‘ ) AS raznFROM base;
Форма ответа