在SQL Server中计算特定月份的年龄

时间:2018-10-23 16:05:20

标签: sql sql-server string-comparison

我需要列出某个月中任何一天(例如,6月或7月)的15岁用户的清单,而我试图在SQL Server(存储过程)中使用字符串比较,但并非如此工作。

我从SSRS获得了@Month参数,该参数来自接下来10个月的下拉列表。 (本月的某些时间将在明年)。

我有一个 Age 函数,该函数将日期格式从27/07/2003(出生日期)转换为字符串15 years,2 months,27 days。当然,也有9 years, 0 months, 2 days岁的人。

到目前为止,假设我们想知道他们是否已年满15岁,我可以编写代码来检查该人是否在明年7月(15 years,1 months)年满15岁并且至少一个月(@Month + 1) (@Month)在6月份,但是由于字符串比较仍然无法正常工作。

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 :(得分:3)

给定您感兴趣的@Month和@Year,然后给您需要的人BY

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

所以所有返回的人在@ Month / @ Year都有15岁生日

-虽然有些痛苦,但是如果一个人在2月29日出生,可能会无法正常工作,他们在3月满15岁,尽管那将永远不是be年,所以您可以逃脱

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

答案 1 :(得分:0)

下面应该向您展示要走的路,您的查询对于您需要的内容来说太复杂了(我认为),只需在您的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)