![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
СТАЖ
mr © (2004-06-10 17:08:00)Простите, хоть тему и закрыли, может поможет?
CREATE Procedure dbo.pr_calc_staj
@dd1 DATETIME,
@dd2 DATETIME,
@stag_coeff_ FLOAT,
@yy int =0 OUTPUT,
@mm int =0 OUTPUT,
@dd int =0 OUTPUT
As
BEGIN
DECLARE
@mm_ INTEGER,
@yy_ INTEGER,
@dd_ INTEGER,
@mm_f FLOAT,
@yy_f FLOAT,
@dd_f FLOAT
SELECT @dd2 = dateadd(day, 1, @dd2)
if @stag_coeff_ = 0 SELECT @stag_coeff_ = 1
SELECT @yy = datediff(year, @dd1, @dd2)
SELECT @mm = datediff(month, dateadd(year, @yy, @dd1), @dd2)
if @mm < 0
BEGIN
SELECT @yy = @yy - 1
SELECT @mm = datediff(month, dateadd(year, @yy, @dd1), @dd2)
END
SELECT @dd = datediff(day, dateadd(month, @mm, dateadd(year, @yy, @dd1)), @dd2)
if @dd < 0
BEGIN
SELECT @mm = @mm - 1 if @mm < 0
SELECT @mm = 11, @yy = @yy - 1
SELECT @dd = datediff(day, dateadd(month, @mm, dateadd(year, @yy, @dd1)), @dd2)
END
-- SELECT @yy = @yy * @stag_coeff_, @mm = @mm * @stag_coeff_, @dd = @dd * @stag_coeff_
SELECT @yy_f = Cast(@yy as float) * @stag_coeff_, @mm_f = Cast(@mm * @stag_coeff_ as float), @dd_f = Cast(@dd * @stag_coeff_ as float)
SELECT @dd = convert(integer,@dd_f) + (@yy_f - convert(integer, @yy_f))*365 SELECT @yy = convert(integer, @yy_f)
SELECT @dd = @dd + (@mm_f - convert(integer, @mm_f))*12 SELECT @mm = convert(integer, @mm_f)
SELECT @dd = convert(integer, @dd) if @dd >= 30
SELECT @mm = @mm + (@dd-(@dd%30))/30, @dd = @dd%30
if @mm >= 12 SELECT @yy = @yy + (@mm-(@mm%12))/12, @mm = @mm%12
if @yy < 0 SELECT @yy = 0, @mm = 0, @dd = 0
select @yy, @mm, @dd
END
sniknik (2004-06-10 17:40:00) [1];( в конце не - 2 а - 1. хотя без разници, в погрешность входит... ;о))
sniknik (2004-06-10 17:34:00) [2]круто..., но неправильно. можно проше
DECLARE @DATE DateTime
SET @DATE = DATEADD(Day, 0, DATEDIFF(Day, '20031231', '20080101'))
SELECT DATEPART(Year, @DATE) - 1900 AS 'Лет',
DATEPART(Month, @DATE) - 1 AS 'Месяцев',
DATEPART(Day, @DATE)-2 AS 'Дней'
но тоже неправильно. погрешности вычисления будут обязательно (связано с тем про что Анатолий Подгорецкий тебе говорил)
даты задаю текстом (строки '20031231', '20080101'), чтобы удобнее пробовать (кстати проверь с февралем в 2000м году (вроде високосный) будет ошибка, как и на многом другом +-пару тройку дней)