Расчет возраста в определенном месяце в SQL Server - PullRequest
0 голосов
/ 23 октября 2018

Мне нужно извлечь список пользователей, которым исполняется 15 лет в любой день определенного месяца (например, в июне или июле), и я пытаюсь использовать сравнение строк в SQL Server (хранимая процедура), но это не такработает.

Я получаю параметр @Month из SSRS, который выдается из выпадающего списка следующих 10 месяцев.(часть этого месяца будет в следующем году).

У меня есть функция Возраст , которая преобразует формат даты из 27/07/2003 (BirthDate) в строку 15 years,2 months,27 days.Естественно, есть и люди в возрасте 9 years, 0 months, 2 days.

Пока что я мог бы написать код, чтобы проверить, будет ли этому человеку 15 лет и, по крайней мере, 1 месяц (15 years,1 months) в следующем июле (@Month + 1), если предположить, что мы хотим знать, исполнится ли ему 15 лет.Июнь (@Month), но все равно не работает из-за сравнения строк.

Age(BirthDate, GETDATE()) - это функция, которая преобразует возраст в этом формате: 15 years,2 months,27 days как строка.

Я надеюсьПонятно, о чем я.

declare @Age varchar (20) = 15,
@Month varchar (25) = 'June',
@CurrentMonth varchar (20) = null,


SET @CurrentMonth = DATENAME(month, GETDATE());  /* returns current month in string */

SELECT BahaiID
    ,Title
    ,FirstName
    ,LastName
    ,Gender
    ,CONVERT(VARCHAR, BirthDate, 103) AS BirthDate
    ,dbo.Age(BirthDate, GETDATE()) AS Age
    ,LocalityName AS Locality
    ,GETDATE() AS ReportDate
    ,MONTH(GETDATE()) AS MONTH
    ,YEAR(GETDATE()) AS YEAR
FROM dbo.vw_individuals
WHERE (LEFT(dbo.Age(BirthDate, DATEADD(month, 1 +
        (SELECT DATEDIFF(MONTH, @CurrentMonth + ' 01 2010', @Month + ' 01 2010')
         + CASE WHEN DATEDIFF(MONTH, @CurrentMonth + ' 01 2010', @Month + ' 01 2010') < 0 THEN 12 ELSE 0 END) 
    , GETDATE())), 2) = @Age)   
    AND (LEFT(dbo.Age(BirthDate, DATEADD(month, 1 +
        (SELECT DATEDIFF(MONTH, @CurrentMonth + ' 01 2010', @Month + ' 01 2010')
         + CASE WHEN DATEDIFF(MONTH, @CurrentMonth + ' 01 2010', @Month + ' 01 2010') < 0 THEN 12 ELSE 0 END)
    , GETDATE())), 16) < @Age + ' years,2 month')

    AND (month(convert(DATETIME, BirthDate, 103)) = (SELECT DATEPART(MM, @Month + '01 2010'))) /* Checks if the BirthDate month is the same as the chosen month (@Month) */

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Ниже следует показать вам путь, ваш запрос слишком сложен для того, что вам нужно (я думаю), просто используйте логику из моего IF в вашем WHERE

declare @dob datetime = '2003-10-13 17:21:45.620'

if(month(@dob) = month(getdate()) 
AND year(@dob)+15 = year(getdate()))
    print '15 years old this month'
else
    print 'not 15 years old this month'

То же самоеярмо, только что использованная табличная переменная:

declare @dob datetime = '2003-10-13 17:21:45.620'
declare @t table (dob datetime)
insert into @t
values ('2003-10-13 17:21:45.620'), ('2004-10-13 17:21:45.620'), ('2003-10-30 17:21:45.620')

select *
from @t
where month(dob) = month(getdate()) 
    and year(dob)+15 = year(getdate())

РЕДАКТИРОВАТЬ

Другой способ добиться того, что вам нужно, это использовать DATEDIFF

declare @dob datetime = '2003-10-13 17:21:45.620'
declare @t table (dob datetime)
insert into @t
values ('2003-10-13 17:21:45.620'), 
    ('2004-10-13 17:21:45.620'), 
    ('2003-10-30 17:21:45.620')

select *
from @t
where datediff(month, dob, getdate()) = 180 --(15 years * 12months)
0 голосов
/ 23 октября 2018

с учетом @Month и @Year, которые вас интересуют, тогда людям, которые вам нужны, дают BY

  SELECT ..... WHERE YEAR(BirthDate) = @YEAR - 15 AND Month(BirthDate) = @Month

, поэтому всем возвращенным людям исполняется 15 лет в @ Month / @ Year

- немного боли, хотя, может быть, не совсем сработает, если человек родится 29 февраля, ему исполняется 15 лет в марте, хотя это никогда не будет високосным годом, так что вы можете обойтись без

SELECT ..... WHERE YEAR(BirthDate) = @YEAR - 15 
               AND Month(BirthDate) 
                  + CASE WHEN MONTH(Birthdate) = 2 AND DAY(Birthdate) = 29 THEN 1 ELSE 0 END 
                       = @Month 
...