Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

СТАЖ   Найти похожие ветки 

 
mr   (2004-06-10 17:08) [0]

Простите, хоть тему и закрыли, может поможет?

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:34) [1]

круто..., но неправильно. можно проше

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м году (вроде високосный) будет ошибка, как и на многом другом +-пару тройку дней)


 
sniknik ©   (2004-06-10 17:40) [2]

;( в конце не - 2 а - 1. хотя без разници, в погрешность входит... ;о))



Страницы: 1 вся ветка

Текущий архив: 2004.07.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 2.013 c
1-1087892731
}|{yk
2004-06-22 12:25
2004.07.04
Как передав SendMessage указатель на строку


1-1087481169
p_sA[11]
2004-06-17 18:06
2004.07.04
Реестр: Как прочитать все имена ключей в нужном мне разделе?


6-1084219742
ZDDR
2004-05-11 00:09
2004.07.04
idudpserver1


1-1087566561
Артем
2004-06-18 17:49
2004.07.04
Вопрос по WebBrowser


14-1087294951
default
2004-06-15 14:22
2004.07.04
Ещё задачка