Мне нужно извлечь список пользователей, которым исполняется 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) */