Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
bzum@rambler.ru
Guest
Как посчитать возраст человека : Лет Месяцев Дней ?
Спасибо.
10 сен 04, 16:06    [951770]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
джиммерс
Member

Откуда:
Сообщений: 216
declare @birthdate datetime
set @birthdate = '1961-12-27 12:19'
select datediff(yyyy, @birthdate, getdate()) Years, datediff(mm, @birthdate, getdate()) Months, datediff(dd, @birthdate, getdate()) Days

P.S. А вообще человеку столько лет, насколько он заработал.
10 сен 04, 16:12    [951807]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Roamer
Member

Откуда: г.Краснодар
Сообщений: 38
А на результат Вы смотрели? Вряд ли
Years       Months      Days        
----------- ----------- ----------- 
43          513         15598

(1 row(s) affected)
соответствует требуемым цифрам (полных лет, полных месяцев, полных дней).
10 сен 04, 16:26    [951911]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
bzum@rambler.ru
Guest
Ха.
Так я хочу получить :
1) Количество полных лет
(сегодня 10,09,2004 ,
если дата рождения 09,09,2003 то 1 год
если дата рождения 10,09,2003 то 1 год
если дата рождения 11,09,2003 то 0 лет)

2)Количество лет ,месяцев ,дней
в виде 15 лет 3 месяца и 30 дней
а на следующий день уже будет
15 лет 4 месяца и 0 дней

Спасиб.
10 сен 04, 16:33    [951955]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
_bob
Member

Откуда: Москва
Сообщений: 1654
эти datediff'ы надо чуть модернизировать
месяцы = остаток от деления на 12 , дни - разность в дат (только нужно учесть возможный переход через месяц)
10 сен 04, 16:35    [951965]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Old Nick
Member

Откуда: Санкт-Петербург
Сообщений: 3135
declare @birthdate datetime, @Years int, @Months int, @Days int, @Date datetime
set @birthdate = '19611227'

select @Years = datediff(year, @birthdate, getdate())
select @birthdate = dateadd(year, @Years, @birthdate)
if @birthdate > getdate() 
  begin
    select @Years = @Years - 1
    select @birthdate = dateadd(year, -1, @birthdate)
  end

select @Months = datediff(month, @birthdate, getdate())
select @birthdate = dateadd(month, @Months, @birthdate)
if @birthdate > getdate()
  begin
    select @Months = @Months - 1
    select @birthdate = dateadd(month, -1, @birthdate)
  end

select @Days = datediff(day, @birthdate, getdate())
select @birthdate = dateadd(day, @Days, @birthdate)
if @birthdate > getdate()
  select @Days = @Days - 1

select @Years, @Months, @Days

select dateadd(year, @Years, dateadd(month, @Months, dateadd(day, @Days, '19611227')))
10 сен 04, 17:16    [952189]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
MVM
Member

Откуда:
Сообщений: 271
А, это мы уже детали тут.

И мой вариант
declare @dat1 smalldatetime
declare @dat2 smalldatetime
set @dat1='20030128' 
set @dat2='20040229'

declare @year int
declare @month int
declare @day int

declare @ny1 int, @ny2 int, @nm1 int, @nm2 int, @nd1 int, @nd2 int, @kd1 int, @kd2 int
select @ny1 = year(@dat1),@ny2 = year(@dat2),
	@nm1 = month(@dat1), @nm2 = month(@dat2),
	@nd1 = datediff(day, dateadd(day,1-day(@dat1),@dat1),@dat1+1), 
	@nd2 = datediff(day, dateadd(day,1-day(@dat2),@dat2),@dat2+1),
	@kd1 = datediff(day, dateadd(day,1-day(@dat1),@dat1), dateadd(month,1,dateadd(day,1-day(@dat1),@dat1))),
	@kd2 = datediff(day, dateadd(day,1-day(@dat2),@dat2), dateadd(month,1,dateadd(day,1-day(@dat2),@dat2)))

select @year = case when @nm2>=@nm1
			then @ny2-@ny1
			else @ny2-@ny1-1
			end

select @year = case when (@nm2=2 and @nm1=2)and (@nd2=28 and @nd1=29)  
			then @year-1
			else @year
			end

select @month = case    when @nd2>@nd1 and @nm2>@nm1
			then @nm2 - @nm1
			when @nd2>@nd1 and @nm2<@nm1
			then 12+@nm2 - @nm1
			when @nd2>@nd1 and @nm2=@nm1
			then 1
			when @nd2=@nd1 and @nm2>@nm1
			then @nm2 - @nm1 -1
			when @nd2=@nd1 and @nm2<@nm1
			then 11+@nm2 - @nm1
			when @nd2=@nd1 and @nm2=@nm1
			then 0
			when @nd2<@nd1 and @nm2>@nm1
			then @nm2 - @nm1 -1
			when @nd2<@nd1 and @nm2<@nm1
			then 12+@nm2 - @nm1 - 1
			when @nd2<@nd1 and @nm2=@nm1
			then 0
			end

select @month = case when (@nm2=2 and @nm1=2)and (@nd1=29 and @nd2=28)  
		     	then 11
			else @month
			end


select @day= case when @nd2=@nd1
			then 0 
			when @nd2>@nd1 
			then @nd2-@nd1
			else @nd2+(@kd1-@nd1)
			end 

select @year,@month,@day
10 сен 04, 19:35    [952543]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
bzum@rambler.ru
Guest
Интересно.
Заметил ,что datediff дает разницу лет ,но не учитывает был ли день рождения или еще будет.
Так для DATEDIFF(YEAR,'09/12/2000',GETDATE())
И для DATEDIFF(YEAR,'09/14/2000',GETDATE())
результат будет одинаков ,хотя тот ,кто отпраздновал день рождения на год повзрослел.
Спасибо.
13 сен 04, 09:48    [953951]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
bzum@rambler.ru
Guest
Интересно.
Заметил ,что datediff дает разницу лет ,но не учитывает был ли день рождения или еще будет.
Так для DATEDIFF(YEAR,'09/12/2000',GETDATE())
И для DATEDIFF(YEAR,'09/14/2000',GETDATE())
результат будет одинаков ,хотя тот ,кто отпраздновал день рождения на год повзрослел.
Спасибо.
13 сен 04, 09:53    [953961]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Aeon Technologies
Member

Откуда: Kyiv, Ukraine
Сообщений: 216
CREATE FUNCTION GetAge

/*

Version 1.1

This function returns the age of a person, in years, for a given date
of birth. Due to the limitations placed on using the GETDATE() function
within user-defined functions, todays date also needs to be supplied.

***********Created by Karl Grambow. karlgrambow@hotmail.com.*************

*/
(@DateOfBirth datetime, @Today datetime)
RETURNS int
AS
BEGIN

DECLARE @Age int --Age in years.

SET @Age = YEAR(@Today) - YEAR(@DateOfBirth)

IF MONTH(@DateOfBirth) > MONTH(@Today)
BEGIN
SET @Age = @Age - 1
END

IF MONTH(@DateOfBirth) = MONTH(@Today)
BEGIN
IF DAY(@DateOfBirth) > DAY(@Today)
BEGIN
SET @Age = @Age - 1
END
END

RETURN (@Age)

END
6 апр 06, 12:16    [2531022]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33988
Блог
DECLARE @BIRTH smalldatetime
SET @BIRTH = '19870407'
SELECT datediff(year,@BIRTH,getdate()) - CASE
                                           WHEN Month(getdate())<=Month(@BIRTH) and Day(getdate())<Day(@BIRTH) THEN 1
                                           ELSE 0
                                         END
6 апр 06, 12:29    [2531121]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
AndreyF
Member

Откуда:
Сообщений: 432
А есть у кого желание перевести в функцию SQL код VB6 (делал когда-то на эту тематику), а то у меня времени сейчас в обрез:

' Функция получает разницу между датами в заданных единицах даты/времени
' При ReturnString=True возвращает строковое представление интервала
Public Function DateInterval(d1 As Date, d2 As Date, _
        Optional Years As Variant, Optional Months As Variant, Optional Days As Variant, _
        Optional Hours As Variant, Optional Minutes As Variant, Optional Seconds As Variant, _
        Optional ReturnString As Boolean = False) As String
    
    Const sr As String = ", "
    Const y As String = "yyyy", m As String = "m", d As String = "d", _
        h As String = "h", n As String = "n", s As String = "s"
    Dim dm As Date, dd As Date, dh As Date, dn As Date, ds As Date, _
        ss As String, i As Integer, sss As String, s0 As String

    If IsMissing(Years) Then
        dm = d1
    Else
        Years = DateDiff(y, d1, d2)
        dm = DateAdd(y, Years, d1)
        If dm > d2 Then
            Years = Years - 1
            dm = DateAdd(y, Years, d1)
        End If
        If ReturnString Then
            If Years Then
                ss = Right$(Format$(Years, "00"), 2)
                If Right$(ss, 1) = "0" Or Left$(ss, 1) = "1" Or CInt(Right$(ss, 1)) >= 5 Then
                    sss = Years & " лет"
                Else
                    sss = Years & " год"
                    If Right$(ss, 1) <> "1" Then sss = sss & "а"
                End If
            Else
                s0 = "лет"
            End If
        End If
    End If
    If IsMissing(Months) Then
        dd = dm
    Else
        Months = DateDiff(m, dm, d2)
        dd = DateAdd(m, Months, dm)
        If dd > d2 Then
            Months = Months - 1
            dd = DateAdd(m, Months, dm)
        End If
        If ReturnString Then
            If Months Then
                ss = Right$(Format$(Months, "00"), 2)
                If Len(sss) Then sss = sss & sr
                sss = sss & Months & " месяц"
                If Right$(ss, 1) = "0" Or Left$(ss, 1) = "1" Or CInt(Right$(ss, 1)) >= 5 Then
                    sss = sss & "ев"
                Else
                    If Right$(ss, 1) <> "1" Then sss = sss & "а"
                End If
            Else
                s0 = "месяцев"
            End If
        End If
    End If
    If IsMissing(Days) Then
        dh = dd
    Else
        Days = DateDiff(d, dd, d2)
        dh = DateAdd(d, Days, dd)
        If dh > d2 Then
            Days = Days - 1
            dh = DateAdd(d, Days, dd)
        End If
        If ReturnString Then
            If Days Then
                ss = Right$(Format$(Days, "00"), 2)
                If Len(sss) Then sss = sss & sr
                sss = sss & Days & " д"
                If Right$(ss, 1) = "0" Or Left$(ss, 1) = "1" Or CInt(Right$(ss, 1)) >= 5 Then
                    sss = sss & "ней"
                Else
                    sss = sss & IIf(Right$(ss, 1) = "1", "ень", "ня")
                End If
            Else
                s0 = "дней"
            End If
        End If
    End If
    If IsMissing(Hours) Then
        dn = dh
    Else
        Hours = DateDiff(h, dh, d2)
        dn = DateAdd(h, Hours, dh)
        If dn > d2 Then
            Hours = Hours - 1
            dn = DateAdd(h, Hours, dh)
        End If
        If ReturnString Then
            If Hours Then
                ss = Right$(Format$(Hours, "00"), 2)
                If Len(sss) Then sss = sss & sr
                sss = sss & Hours & " час"
                If Right$(ss, 1) = "0" Or Left$(ss, 1) = "1" Or CInt(Right$(ss, 1)) >= 5 Then
                    sss = sss & "ов"
                Else
                    If Right$(ss, 1) <> "1" Then sss = sss & "а"
                End If
            Else
                s0 = "часов"
            End If
        End If
    End If
    If IsMissing(Minutes) Then
        ds = dn
    Else
        Minutes = DateDiff(n, dn, d2)
        ds = DateAdd(n, Minutes, dn)
        If ds > d2 Then
            Minutes = Minutes - 1
            ds = DateAdd(n, Minutes, dn)
        End If
        If ReturnString Then
            If Minutes Then
                ss = Right$(Format$(Minutes, "00"), 2)
                If Len(sss) Then sss = sss & sr
                sss = sss & Minutes & " минут"
                If Not (Right$(ss, 1) = "0" Or Left$(ss, 1) = "1" Or CInt(Right$(ss, 1)) >= 5) Then
                    sss = sss & IIf(Right$(ss, 1) = "1", "а", "ы")
                End If
            Else
                s0 = "минут"
            End If
        End If
    End If
    If Not IsMissing(Seconds) Then
        Seconds = DateDiff(s, ds, d2)
        If ReturnString Then
            If Seconds Then
                ss = Right$(Format$(Seconds, "00"), 2)
                If Len(sss) Then sss = sss & sr
                sss = sss & Seconds & " секунд"
                If Not (Right$(ss, 1) = "0" Or Left$(ss, 1) = "1" Or CInt(Right$(ss, 1)) >= 5) Then
                    sss = sss & IIf(Right$(ss, 1) = "1", "а", "ы")
                End If
            Else
                s0 = "секунд"
            End If
        End If
    End If
    If ReturnString Then DateInterval = IIf(Len(sss), sss, "0 " & s0)
End Function
6 апр 06, 12:54    [2531291]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33988
Блог
см. BOL
DATEDIFF ( datepart , startdate , enddate )
6 апр 06, 12:57    [2531321]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Anap
Member

Откуда:
Сообщений: 43
SELECT CASE WHEN MONTH(DataRojdeniya)>MONTH(@D) THEN YEAR(@D)-YEAR(DataRojdeniya) -1 ELSE
CASE WHEN MONTH(DataRojdeniya)=MONTH(@D) AND DAY(DataRojdeniya)>DAY(@D) THEN YEAR(@D)-YEAR(DataRojdeniya)-1 ELSE
YEAR(@D)-YEAR(DataRojdeniya) END END AS KvoLet,
CASE WHEN MONTH(DataRojdeniya)>MONTH(@D) THEN (MONTH(@D)+12)-MONTH(DataRojdeniya) ELSE
CASE WHEN MONTH(DataRojdeniya)=MONTH(@D) AND DAY(DataRojdeniya)>DAY(@D) THEN 11 ELSE
MONTH(@D)-MONTH(DataRojdeniya) END END AS KvoMes,
DateDIFF(dd,DateADD(dd,-DAY(DataRojdeniya),@D),@D) AS KvoDay
From Table1
6 апр 06, 13:39    [2531617]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
AndreyF
Member

Откуда:
Сообщений: 432
В общем, написал две функции для сервера. Первая возвращает указанную часть возраста/стажа. Вторая - строку типа: 13 лет, 5 месяцев, 23 дня.

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server

Partial Public Class UserDefinedFunctions
    <Microsoft.SqlServer.Server.SqlFunction()> _
    Public Shared Function ufnGetAgo(ByVal d1 As Date, ByVal d2 As Date, _
                    ByVal RetValue As Char, _
                    Optional ByVal RetValues As String = "YMDHNS" _
                ) As SqlInt32
        Dim Years As Integer, Months As Integer, Weeks As Integer, Days As Integer, Hours As Integer, Minutes As Integer, Seconds As Integer
        Dim dm As Date, dw As Date, dd As Date, dh As Date, dn As Date, ds As Date

        RetValue = UCase(RetValue)
        RetValues = UCase(RetValues)
        If RetValues.IndexOf(RetValue) < 0 Then Return New SqlInt32()

        If RetValues.IndexOf("Y") < 0 Then
            dm = d1
            If RetValue = "Y" Then Return New SqlInt32()
        Else
            Years = CInt(DateDiff(DateInterval.Year, d1, d2))
            dm = DateAdd(DateInterval.Year, Years, d1)
            If dm > d2 Then
                Years -= 1
                dm = DateAdd(DateInterval.Year, Years, d1)
            End If
        End If
        If RetValue = "Y" Then Return New SqlInt32(Years)

        If RetValues.IndexOf("M") < 0 Then
            dw = dm
            If RetValue = "M" Then Return New SqlInt32()
        Else
            Months = CInt(DateDiff(DateInterval.Month, dm, d2))
            dw = DateAdd(DateInterval.Month, Months, dm)
            If dw > d2 Then
                Months -= 1
                dw = DateAdd(DateInterval.Month, Months, dm)
            End If
        End If
        If RetValue = "M" Then Return New SqlInt32(Months)

        If RetValues.IndexOf("W") < 0 Then
            dd = dw
            If RetValue = "W" Then Return New SqlInt32()
        Else
            Weeks = CInt(DateDiff(DateInterval.Weekday, dw, d2))
            dd = DateAdd(DateInterval.Weekday, Weeks, dw)
            If dd > d2 Then
                Weeks -= 1
                dd = DateAdd(DateInterval.Weekday, Weeks, dw)
            End If
        End If
        If RetValue = "W" Then Return New SqlInt32(Weeks)

        If RetValues.IndexOf("D") < 0 Then
            dh = dd
            If RetValue = "D" Then Return New SqlInt32()
        Else
            Days = CInt(DateDiff(DateInterval.Day, dd, d2))
            dh = DateAdd(DateInterval.Day, Days, dd)
            If dh > d2 Then
                Days -= 1
                dh = DateAdd(DateInterval.Day, Days, dd)
            End If
        End If
        If RetValue = "D" Then Return New SqlInt32(Days)

        If RetValues.IndexOf("H") < 0 Then
            dn = dh
            If RetValue = "H" Then Return New SqlInt32()
        Else
            Hours = CInt(DateDiff(DateInterval.Hour, dh, d2))
            dn = DateAdd(DateInterval.Hour, Hours, dh)
            If dn > d2 Then
                Hours -= 1
                dn = DateAdd(DateInterval.Hour, Hours, dh)
            End If
        End If
        If RetValue = "H" Then Return New SqlInt32(Hours)

        If RetValues.IndexOf("N") < 0 Then
            ds = dn
            If RetValue = "N" Then Return New SqlInt32()
        Else
            Minutes = CInt(DateDiff(DateInterval.Minute, dn, d2))
            ds = DateAdd(DateInterval.Minute, Minutes, dn)
            If ds > d2 Then
                Minutes -= 1
                ds = DateAdd(DateInterval.Minute, Minutes, dn)
            End If
        End If
        If RetValue = "N" Then Return New SqlInt32(Minutes)

        If Seconds = 0 Then
            Return New SqlInt32()
        Else
            Seconds = CInt(DateDiff(DateInterval.Second, ds, d2))
        End If
        If RetValue = "S" Then Return New SqlInt32(Minutes)
    End Function

    <Microsoft.SqlServer.Server.SqlFunction()> _
    Public Shared Function ufnGetAgoString(ByVal d1 As Date, ByVal d2 As Date, _
                    Optional ByVal RetValues As String = "YMDHNS" _
                ) As SqlString

        Const sr As String = ", "
        Dim Years As Integer, Months As Integer, Weeks As Integer, Days As Integer, Hours As Integer, Minutes As Integer, Seconds As Integer
        Dim dm As Date, dw As Date, dd As Date, dh As Date, dn As Date, ds As Date
        Dim ss As String, s0 As String = vbNullString, sb As New System.Text.StringBuilder

        RetValues = RetValues.ToUpper
        If RetValues.Length = 0 Then Return New SqlString()

        If RetValues.IndexOf("Y") < 0 Then
            dm = d1
        Else
            Years = CInt(DateDiff(DateInterval.Year, d1, d2))
            dm = DateAdd(DateInterval.Year, Years, d1)
            If dm > d2 Then
                Years -= 1
                dm = DateAdd(DateInterval.Year, Years, d1)
            End If
            If Years > 0 Then
                ss = Right(Years.ToString, 2)
                If ss.EndsWith("0") Or ss.StartsWith("1") Or CInt(Right(ss, 1)) >= 5 Then
                    sb.Append(Years.ToString & " лет")
                Else
                    sb.Append(Years.ToString & " год")
                    If Not ss.EndsWith("1") Then sb.Append("а")
                End If
            Else
                s0 = "лет"
            End If
        End If

        If RetValues.IndexOf("M") < 0 Then
            dw = dm
        Else
            Months = CInt(DateDiff(DateInterval.Month, dm, d2))
            dw = DateAdd(DateInterval.Month, Months, dm)
            If dw > d2 Then
                Months -= 1
                dw = DateAdd(DateInterval.Month, Months, dm)
            End If
            If Months > 0 Then
                ss = Right((100 + Months).ToString, 2)
                If sb.Length > 0 Then sb.Append(sr)
                sb.Append(Months.ToString & " месяц")
                If ss.EndsWith("0") Or ss.StartsWith("1") Or CInt(Right(ss, 1)) >= 5 Then
                    sb.Append("ев")
                Else
                    If Not ss.EndsWith("1") Then sb.Append("а")
                End If
            Else
                s0 = "месяцев"
            End If
        End If

        If RetValues.IndexOf("W") < 0 Then
            dd = dw
        Else
            Weeks = CInt(DateDiff(DateInterval.WeekOfYear, dw, d2))
            dd = DateAdd(DateInterval.WeekOfYear, Weeks, dw)
            If dd > d2 Then
                Weeks -= 1
                dd = DateAdd(DateInterval.WeekOfYear, Weeks, dw)
            End If
            If Weeks > 0 Then
                ss = Right((100 + Weeks).ToString, 2)
                If sb.Length > 0 Then sb.Append(sr)
                sb.Append(Weeks.ToString & " недел")
                If ss.EndsWith("0") Or ss.StartsWith("1") Or CInt(Right(ss, 1)) >= 5 Then
                    sb.Append("ь")
                Else
                    sb.Append(IIf(ss.EndsWith("1"), "я", "и"))
                End If
            Else
                s0 = "недель"
            End If
        End If

        If RetValues.IndexOf("D") < 0 Then
            dh = dd
        Else
            Days = CInt(DateDiff(DateInterval.Day, dd, d2))
            dh = DateAdd(DateInterval.Day, Days, dd)
            If dh > d2 Then
                Days -= 1
                dh = DateAdd(DateInterval.Day, Days, dd)
            End If
            If Days > 0 Then
                ss = Right((100 + Days).ToString, 2)
                If sb.Length > 0 Then sb.Append(sr)
                sb.Append(Days.ToString & " д")
                If ss.EndsWith("0") Or ss.StartsWith("1") Or CInt(Right(ss, 1)) >= 5 Then
                    sb.Append("ней")
                Else
                    sb.Append(IIf(ss.EndsWith("1"), "ень", "ня"))
                End If
            Else
                s0 = "дней"
            End If
        End If

        If RetValues.IndexOf("H") < 0 Then
            dn = dh
        Else
            Hours = CInt(DateDiff(DateInterval.Hour, dh, d2))
            dn = DateAdd(DateInterval.Hour, Hours, dh)
            If dn > d2 Then
                Hours -= 1
                dn = DateAdd(DateInterval.Hour, Hours, dh)
            End If
            If Hours > 0 Then
                ss = Right((100 + Hours).ToString, 2)
                If sb.Length > 0 Then sb.Append(sr)
                sb.Append(Hours.ToString & " час")
                If ss.EndsWith("0") Or ss.StartsWith("1") Or CInt(Right(ss, 1)) >= 5 Then
                    sb.Append("ов")
                Else
                    If Not ss.EndsWith("1") Then sb.Append("а")
                End If
            Else
                s0 = "часов"
            End If
        End If

        If RetValues.IndexOf("N") < 0 Then
            ds = dn
        Else
            Minutes = CInt(DateDiff(DateInterval.Minute, dn, d2))
            ds = DateAdd(DateInterval.Minute, Minutes, dn)
            If ds > d2 Then
                Minutes -= 1
                ds = DateAdd(DateInterval.Minute, Minutes, dn)
            End If
            If Minutes > 0 Then
                ss = Right((100 + Minutes).ToString, 2)
                If sb.Length > 0 Then sb.Append(sr)
                sb.Append(Minutes.ToString & " минут")
                If Not (ss.EndsWith("0") Or ss.StartsWith("1") Or CInt(Right(ss, 1)) >= 5) Then
                    sb.Append(IIf(ss.EndsWith("1"), "а", "ы"))
                End If
            Else
                s0 = "минут"
            End If
        End If

        If RetValues.IndexOf("N") >= 0 Then
            Seconds = CInt(DateDiff(DateInterval.Second, ds, d2))
            If Seconds > 0 Then
                ss = Right((100 + Seconds).ToString, 2)
                If sb.Length > 0 Then sb.Append(sr)
                sb.Append(Seconds.ToString & " секунд")
                If Not (ss.EndsWith("0") Or ss.StartsWith("1") Or CInt(Right$(ss, 1)) >= 5) Then
                    sb.Append(IIf(ss.EndsWith("1"), "а", "ы"))
                End If
            Else
                s0 = "секунд"
            End If
        End If

        If sb.Length > 0 Then
            Return New SqlString(sb.ToString)
        Else
            Return New SqlString("0 " & s0)
        End If
    End Function
End Class

Пример использования:

Select 
	Лет = dbo.ufnGetAgo('19621010',GETDATE(), 'Y', 'Y'),
	Месяцев = dbo.ufnGetAgo('19621010',GETDATE(), 'M', 'YM'),
	ВсегоМесяцев = dbo.ufnGetAgo('19621010',GETDATE(), 'M', 'M'),
	[Возраст строкой] = dbo.ufnGetAgoString('19621010',GETDATE(), 'YMDHNS')
UNION ALL
Select 
	Лет = dbo.ufnGetAgo('19621010',GETDATE(), 'Y', 'Y'),
	Месяцев = dbo.ufnGetAgo('19621010',GETDATE(), 'M', 'YM'),
	ВсегоМесяцев = dbo.ufnGetAgo('19921010',GETDATE(), 'M', 'M'),
	[Возраст строкой] = dbo.ufnGetAgoString('19921010',GETDATE(), 'YMDHNS')
UNION ALL
Select 
	Лет = dbo.ufnGetAgo('19621010',GETDATE(), 'Y', 'Y'),
	Месяцев = dbo.ufnGetAgo('19621010',GETDATE(), 'M', 'YM'),
	ВсегоМесяцев = dbo.ufnGetAgo('19921010',GETDATE(), 'M', 'M'),
	[Возраст строкой] = dbo.ufnGetAgoString('19921015',GETDATE(), 'YMDHNS')
UNION ALL
Select 
	Лет = dbo.ufnGetAgo('19621010',GETDATE(), 'Y', 'Y'),
	Месяцев = dbo.ufnGetAgo('19621010',GETDATE(), 'M', 'YM'),
	ВсегоМесяцев = dbo.ufnGetAgo('19921010',GETDATE(), 'M', 'M'),
	[Возраст строкой] = dbo.ufnGetAgoString('19921015',GETDATE(), 'wDHNS')

Ну и результат примера:

Лет         Месяцев     ВсегоМесяцев Возраст строкой                                                                                                                                                                                                                                                  
----------- ----------- ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
43          5           521          43 года, 5 месяцев, 28 дней, 11 часов, 37 минут, 39 секунд                                                                                                                                                                                                       
43          5           161          13 лет, 5 месяцев, 28 дней, 11 часов, 37 минут, 39 секунд                                                                                                                                                                                                        
43          5           161          13 лет, 5 месяцев, 23 дня, 11 часов, 37 минут, 39 секунд                                                                                                                                                                                                         
43          5           161          703 недели, 1 день, 11 часов, 37 минут, 39 секунд
7 апр 06, 12:05    [2535724]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Geolog2000
Member

Откуда:
Сообщений: 114
AndreyF,

Добрый день

Очень интересное решение и главное очень нужное)
подскажите как прикрутить эту функции к MSSQL2008?

Заранее спасибо
10 янв 14, 15:15    [15397355]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Определение возраста по дате рождения и тек.дате
Как быстро определить сколько лет человеку по дате рождения

Что интересного в решениях этой темы - не понимаю.
10 янв 14, 16:16    [15397885]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать возраст человека : Лет Месяцев Дней ?  [new]
Geolog2000
Member

Откуда:
Сообщений: 114
iap
Определение возраста по дате рождения и тек.дате
Как быстро определить сколько лет человеку по дате рождения

Что интересного в решениях этой темы - не понимаю.


Интерес в том что результат возвращается уже в строчном виде с правильными склонениями)
( 13 лет, 5 месяцев, 23 дня, 11 часов, 37 минут, 39 секунд)
13 янв 14, 07:17    [15406050]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить