Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 разность между двумя датами в формате год месяц день  [new]
КомрадТичер
Guest
Где-то видел обсуждение алгоритма вычисления разности между двумя датами в формате год месяц день, но так и не смог найти.
Суть в том, что необходимо не взять от разности дат и посчитать / 365 - год и / 12 месяц а остаток день, а сравнить на принаделжность месяцу и т.п. и т.д.

Спасибо.
13 май 09, 13:36    [7174660]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Glory
Member

Откуда:
Сообщений: 104760
КомрадТичер
двумя датами в формате год месяц день, но так и не смог найти.

Тип данных то какой ?
13 май 09, 13:37    [7174675]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
КомрадТичер
Guest
ну так , видимо, три поля в результате: Год, Месяц и День
13 май 09, 13:39    [7174687]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Автор, Вы хотите результат типа "между этими двумя датами 3 года, 5 месяцев и 8 дней" ?
А зачем Вам такой результат, какой его физический смысл ?
13 май 09, 13:40    [7174701]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Glory
Member

Откуда:
Сообщений: 104760
КомрадТичер
ну так , видимо, три поля в результате: Год, Месяц и День

_входной тип_ какой ? А не результат
13 май 09, 13:41    [7174714]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
КомрадТичер
Guest
банк требует данные, если дата паспорта не укладывается в 14, 20, 45 то не принимает.
так вот день в день 20 лет например или 20 лет и 1 день или 19 лет 12 месяцев 31 день поймать иначе то не очень то и просто.

вот попробуйте например
28 февраял 1981 и 28 февраля 2009
или
29 февраял 1980 и 28 февраля 2009

спасибо.
13 май 09, 13:46    [7174744]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
проходящий.
Guest
Паганель
Автор, Вы хотите результат типа "между этими двумя датами 3 года, 5 месяцев и 8 дней" ?
И еще: каких 3 года и каких 5 месяцев?
13 май 09, 13:47    [7174756]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
КомрадТичер
банк требует данные, если дата паспорта не укладывается в 14, 20, 45 то не принимает
Что такое 14, 20, 45 ?
13 май 09, 13:49    [7174766]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
проходящий.
Guest
КомрадТичер
банк требует данные, если дата паспорта не укладывается в 14, 20, 45 то не принимает.
так вот день в день 20 лет например или 20 лет и 1 день или 19 лет 12 месяцев 31 день поймать иначе то не очень то и просто.

вот попробуйте например
28 февраял 1981 и 28 февраля 2009
или
29 февраял 1980 и 28 февраля 2009

спасибо.
Сударь, а не нужно ли Вам просто сравнение на больше/меньше/равно для дат?
13 май 09, 13:49    [7174768]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
проходящий.
И еще: каких 3 года и каких 5 месяцев?
Вот потому я и спрашивал - какой смысл ?
13 май 09, 13:49    [7174772]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Паганель
КомрадТичер
банк требует данные, если дата паспорта не укладывается в 14, 20, 45 то не принимает
Что такое 14, 20, 45 ?
Лет, поди. А приз будет, если я угадал?
13 май 09, 13:50    [7174774]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
КомрадТичер
Guest
СРАВНЕНИЕ???? :-[
13 май 09, 13:51    [7174784]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
проходящий.
Guest
КомрадТичер
СРАВНЕНИЕ???? :-[
Да, сравнение. Больше/меньше 14 лет? Не такой ли вопрос на самом деле ставит банк?
13 май 09, 13:53    [7174797]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
КомрадТичер
Guest
А, господи.
Вопрос в том, что есть дата рождения, есть дата выдачи паспорта.
Положено его менять в 14, 20 и 45 лет, надо вычислить, у кого паспорт просрочен - не поменял в указанные 14, 20, 45 лет. День в день!
Вот и как посчитать???
13 май 09, 13:57    [7174835]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Glory
Member

Откуда:
Сообщений: 104760
КомрадТичер
А, господи.
Вопрос в том, что есть дата рождения, есть дата выдачи паспорта.
Положено его менять в 14, 20 и 45 лет, надо вычислить, у кого паспорт просрочен - не поменял в указанные 14, 20, 45 лет. День в день!
Вот и как посчитать???

И какая проболема прибавить к дате рождения человека 14, 20 или 45 лет и сравнить с текущей датой ?
13 май 09, 13:59    [7174848]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
проходящий.
Guest
КомрадТичер
А, господи.
Вопрос в том, что есть дата рождения, есть дата выдачи паспорта.
Положено его менять в 14, 20 и 45 лет, надо вычислить, у кого паспорт просрочен - не поменял в указанные 14, 20, 45 лет. День в день!
Вот и как посчитать???
Ну и в чем проблема?
Дата выдачи>(Дата рождения+45 лет)?
13 май 09, 14:05    [7174892]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Erik_Kartmann
Member

Откуда: Пиндырдышханда
Сообщений: 948
Для понимания результата запроса потребуется ещё и начальную и конечную дату хранить.
13 май 09, 14:24    [7175050]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Tigrist
Member

Откуда: Россия-Таиланд-Корея
Сообщений: 477
проходящий.
КомрадТичер
А, господи.
Вопрос в том, что есть дата рождения, есть дата выдачи паспорта.
Положено его менять в 14, 20 и 45 лет, надо вычислить, у кого паспорт просрочен - не поменял в указанные 14, 20, 45 лет. День в день!
Вот и как посчитать???
Ну и в чем проблема?
Дата выдачи>(Дата рождения+45 лет)?

У нормального паспорта может
Дата выдачи>(Дата рождения+45 лет)
Предположим паспорт был просрочен, а потом человек пошел и получил новый и ничего страшного в этом нет.
Другой вопрос, что у паспорта есть срок действия (Expire date, так сказать)
Вот ее и надо вычислять, и потом сравнивать в запросе, попадает ли текущая (или заданная дата) между Дата выдачи и Expire Date. Если попадает, то хорошо. Не попадает, паспорт недействительный
13 май 09, 14:28    [7175085]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Tigrist
проходящий.
КомрадТичер
А, господи.
Вопрос в том, что есть дата рождения, есть дата выдачи паспорта.
Положено его менять в 14, 20 и 45 лет, надо вычислить, у кого паспорт просрочен - не поменял в указанные 14, 20, 45 лет. День в день!
Вот и как посчитать???
Ну и в чем проблема?
Дата выдачи>(Дата рождения+45 лет)?

У нормального паспорта может
Дата выдачи>(Дата рождения+45 лет)
Предположим паспорт был просрочен, а потом человек пошел и получил новый и ничего страшного в этом нет.
Другой вопрос, что у паспорта есть срок действия (Expire date, так сказать)
Вот ее и надо вычислять, и потом сравнивать в запросе, попадает ли текущая (или заданная дата) между Дата выдачи и Expire Date. Если попадает, то хорошо. Не попадает, паспорт недействительный
У российского паспорта нет никакой Expire Date! Разве что дата смерти владельца...
13 май 09, 16:02    [7175749]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
КомрадТичер
Где-то видел обсуждение алгоритма вычисления разности между двумя датами в формате год месяц день, но так и не смог найти.
Суть в том, что необходимо не взять от разности дат и посчитать / 365 - год и / 12 месяц а остаток день, а сравнить на принаделжность месяцу и т.п. и т.д.

Спасибо.


Я как-то писал подобный алгоритм, когда нужно было рассчитать стаж сотрудника в таком формате.
Считает в столбик, как делает большинство кадровиков (1 мес = 30 дней). Фишка с "365 - год" не прокатит, т.к. даст приближённый результат.

CREATE  function getddiff (@fromdate datetime, @todate datetime)
returns varchar(100)
as
begin
declare @extdate datetime, @view_date datetime,
@y int, @m int, @d int, @sy int, @sm int, @sd int,
@ey int, @em int, @ed int, @dd int, @dm int, @time varchar(100)

select @extdate=dateadd(day,case when month(@todate) in (1,3,5,7,8,10,12) and day(@todate)=30 then 2 else 1 end,@todate)
select @ey=year(@extdate), @em=month(@extdate), @ed=day(@extdate),
@sy=year(@fromdate), @sm=month(@fromdate), @sd=day(@fromdate)

declare @tmp table (y int, m int, d int)

insert into @tmp
select 0,0,0

update @tmp
set
 @dd=case when @ed-@sd<0 then 1 else 0 end,
 @dm=case when @em-@sm-@dd<0 then 1 else 0 end,
 @d=@dd*30+@ed-@sd, @m=@dm*12+@em-@sm-@dd, @y=@ey-@sy-@dm,
y=@y,
m=@m,
d=@d

select @time=case when y=0 then '' else convert(varchar(10),y)+
	case when y%10=1 and y!=11 then ' год'
	when y%10 in (2,3,4) and y not in (12,13,14) then ' года'
	else ' лет' end+
	case when m+d>0 then ' ' else '' end
    end+
case when m=0 then '' else convert(varchar(10),m)+
	case when m=1 then ' месяц'
	when m in (2,3,4) then ' месяца'
	else ' месяцев' end
	+case when d>0 then ' ' else '' end
    end+
case when d=0 then '' else convert(varchar(10),d)+
	case when d%10=1 and d!=11 then ' день'
	when d%10 in (2,3,4) and d not in (12,13,14) then ' дня'
	else ' дней' end
    end
 from @tmp

return @time
end
13 май 09, 18:50    [7176515]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Сид
Фишка с "365 - год" не прокатит, т.к. даст приближённый результат.
А "1 мес = 30 дней" даст результат абсолютно точный!
13 май 09, 20:18    [7176726]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
iap
Сид
Фишка с "365 - год" не прокатит, т.к. даст приближённый результат.
А "1 мес = 30 дней" даст результат абсолютно точный!


Абсолютно точного результата в данном расчёте получить нельзя, т.к. нет для этого единого стандарта. Если делить на 365 (а чуть точнее - на 365.25), тоже будет лишь приближение, и сработает только при кол-ве високосных лет, равном общему кол-ву лет, делённому на 4. По крайней мере, кадровики (про остальных не знаю) считают 1 мес=30 дней, но не через деление, а через вычитание дат в столбик.
13 май 09, 20:56    [7176777]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
Если кто-то будет использовать мою функцию, прибейте объявление @view_date. Не нужно сие там.
13 май 09, 21:08    [7176802]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
woolf
Member

Откуда: Днепропетровск
Сообщений: 36
А чем неподходят функции DateDiff, DateADD
14 май 09, 00:32    [7177241]     Ответить | Цитировать Сообщить модератору
 Re: разность между двумя датами в формате год месяц день  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
Сид
Абсолютно точного результата в данном расчёте получить нельзя, т.к. нет для этого единого стандарта. Если делить на 365 (а чуть точнее - на 365.25), тоже будет лишь приближение, и сработает только при кол-ве високосных лет, равном общему кол-ву лет, делённому на 4.


как-то это все подозрительно.
вроде бы всегда между 1 мая прошлого года и 1 мая текущего года был ГОД. И неважно високосный или нет.
Если кто-то родился 15 апреля 1980г то 15 апреля 2009 года ему 29 лет.. а не 29 и сколько-то там десятых (потому что были високосные года и проч).

Между 1 февраля и 1 марта - МЕСЯЦ.

Т.о. присоединяюсь к предыдущему вопросу, чем не угодили DateDiff, DateADD ?
14 май 09, 03:36    [7177376]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить