我需要列出某个月中任何一天(例如,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) */
答案 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)