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;