我必须制定两个月度报告,每个月报告如下:
对于从报告运行日起21个月前已满的个人,我尝试了一下,但没有成功:
DATEDIFF(YEAR,BIRTHDAY, DATEADD(Month,-6,GETDATE())) = 21
对于六个月内将满21岁但又增加一个月的个人
DATEDIFF(YEAR,BIRTHDAY, DATEADD(Month,1,DATEADD(Month,6,GETDATE()))) = 21
答案 0 :(得分:1)
此答案适用于SQL Server。
我已经创建了一些测试数据,但看不到什么是行不通的。
在您自己的计算机上进行测试的一个好方法是使用一些示例数据创建一个临时表,然后查看输出结果。这是我使用的测试;
IF OBJECT_ID('tempdb..#People') IS NOT NULL DROP TABLE #People
CREATE TABLE #People (Name varchar(20), Birthdate datetime)
INSERT INTO #People (Name, Birthdate)
VALUES
('Alice','1997-12-07')
,('Brenda','1998-01-01')
,('Charlie','2001-12-25')
,('Deborah','1997-07-01')
,('Erik','1985-01-01')
SELECT
*
,DATEADD(Month,-6,GETDATE()) AS SixMonthsAgoDate
,DATEDIFF(YEAR, Birthdate, DATEADD(Month,-6,GETDATE())) AgeSixMonthsAgo
,DATEADD(Month,1,DATEADD(Month,6,GETDATE())) SevenMonthsFutureDate
,DATEDIFF(YEAR, Birthdate, DATEADD(Month,7,GETDATE())) AgeSevenMonthsFuture
FROM #People
最后4个计算是您的计算(除了最后一个计算,您要添加6个月,然后分别添加1个月,我将其更改为仅添加7个月)。
输出看起来像这样;
Name Birthdate SixMonthsAgoDate AgeSixMonthsAgo SevenMonthsFutureDate AgeSevenMonthsFuture
Alice 1997-12-07 00:00:00.000 2018-12-07 14:38:22.370 21 2020-01-07 14:38:22.370 23
Brenda 1998-01-01 00:00:00.000 2018-12-07 14:38:22.370 20 2020-01-07 14:38:22.370 22
Charlie 2001-12-25 00:00:00.000 2018-12-07 14:38:22.370 17 2020-01-07 14:38:22.370 19
Deborah 1997-07-01 00:00:00.000 2018-12-07 14:38:22.370 21 2020-01-07 14:38:22.370 23
Erik 1985-01-01 00:00:00.000 2018-12-07 14:38:22.370 33 2020-01-07 14:38:22.370 35
哪种方法可以很好地满足您的要求。
请使用您的实际数据随意尝试上述查询,以便您可以自己调试。如果没有样本数据和预期的输出,我们在堆栈溢出上可以做的事情就很多。
如果您要在人们的出生月份解决这个问题,那么最好在几个月而不是几年内完成。像这样的东西
SELECT
*
,DATEADD(Month,-6,GETDATE()) AS SixMonthsAgoDate
,DATEDIFF(MONTH, Birthdate, DATEADD(Month,-6,GETDATE())) AgeSixMonthsAgo_Months
,DATEADD(Month,1,DATEADD(Month,6,GETDATE())) SevenMonthsFutureDate
,DATEDIFF(MONTH, Birthdate, DATEADD(Month,7,GETDATE())) AgeSevenMonthsFuture_Months
FROM #People
然后您的where子句看起来像这样;
DATEDIFF(MONTH, Birthdate, DATEADD(Month,-6,GETDATE())) = (21 * 12)
和
DATEDIFF(MONTH, Birthdate, DATEADD(Month,7,GETDATE())) = (21 * 12)
甚至对此进一步简化;
DATEDIFF(MONTH, Birthdate, GETDATE()) = (21 * 12) - 6
DATEDIFF(MONTH, Birthdate, GETDATE()) = (21 * 12) + 7