SQL查询显示三个月前年满21岁的人,以及从运行日期起六个月再加上一个月的年满21岁的人

时间:2019-06-07 13:23:44

标签: sql sql-server

我必须制定两个月度报告,每个月报告如下:

  • 在报告运行日起六个月前年满21岁的个人
  • 从报告运行日期起六个月内将满21岁的个人,但增加一个月。

对于从报告运行日起21个月前已满的个人,我尝试了一下,但没有成功:

DATEDIFF(YEAR,BIRTHDAY, DATEADD(Month,-6,GETDATE())) = 21

对于六个月内将满21岁但又增加一个月的个人

DATEDIFF(YEAR,BIRTHDAY, DATEADD(Month,1,DATEADD(Month,6,GETDATE()))) = 21

1 个答案:

答案 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