Sql server 两个日期范围之间的SQL计数期限

Sql server 两个日期范围之间的SQL计数期限,sql-server,datetime,count,range,Sql Server,Datetime,Count,Range,我试图计算数据库中活动记录的年龄,从当前日期到可能的过去日期。 以下是可能的输出: 15至24岁 十二, 24至30岁 十五 30岁及以上 二十五 还有年龄 age count 15 3 16 5 17 1 18 2 19 1 20 0 .... .... 像这样试试 DECLARE @DATETBL TABLE ( ID INT IDENTITY(1,1), POSSIBLEDATES D

我试图计算数据库中活动记录的年龄,从当前日期到可能的过去日期。 以下是可能的输出:

15至24岁 十二,

24至30岁 十五

30岁及以上 二十五

还有年龄

age     count
15        3
16        5
17        1
18        2
19        1
20        0
....     ....
像这样试试

DECLARE @DATETBL TABLE
(
 ID INT IDENTITY(1,1),
 POSSIBLEDATES DATETIME
)
DECLARE @AGETBL TABLE
(
ID INT IDENTITY(1,1),
AGE INT
)
DECLARE @I INT=1
DECLARE @CNT INT

INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1970')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1972')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1975')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1977')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1977')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1977')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1977')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1980')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1983')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1983')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1983')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1986')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1986')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1986')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1986')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1986')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1986')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1989')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1989')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1989')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1989')
INSERT INTO @DATETBL(POSSIBLEDATES) VALUES ('01/01/1990')

SELECT @CNT=COUNT(*) FROM @DATETBL

WHILE @I<=@CNT
BEGIN

DECLARE @BIRTHDATE DATETIME = (SELECT POSSIBLEDATES FROM @DATETBL WHERE ID=@I)

INSERT INTO @AGETBL(AGE)
SELECT YEAR(GETDATE()) - YEAR(@BIRTHDATE) -
       CASE WHEN MONTH(GETDATE()) > MONTH(@BIRTHDATE) OR
                (MONTH(GETDATE()) = MONTH(@BIRTHDATE) AND
                 DAY(GETDATE())  >= DAY(@BIRTHDATE))
            THEN 0 ELSE 1 END AS [AGE]
 SET @I=@I+1           
END    

SELECT AGE,COUNT(*) AGECOUNT FROM @AGETBL WHERE AGE BETWEEN 15 AND 24
OR AGE BETWEEN 25 AND 30  
OR AGE >30      
GROUP BY AGE
ORDER BY AGE

对于以上内容,我已经用临时表进行了尝试,您可以使用数据库中自己的表来获取年龄计数:

;With Ages
AS
(
    SELECT CASE 
            WHEN MONTH(getdate()) > MONTH([YourDate]) THEN DATEDIFF(YEAR, [YourDate], getdate())
            WHEN Month([YourDate]) = MONTH(Getdate()) AND Day([YourDate]) < Day(getdate())
            THEN DATEDIFF(YEAR, [YourDate], getdate()) 
            ELSE DATEDIFF(YEAR, [YourDate], getdate())  - 1 END As Age
    FROM #YourTable
)
SELECT Age, count(*) AS [Count]
FROM Ages
GROUP BY Age
要获取日期范围计数,请执行以下操作:

;With Ages
AS
(
    SELECT CASE 
            WHEN MONTH(getdate()) > MONTH([YourDate]) THEN DATEDIFF(YEAR, [YourDate], getdate())
            WHEN Month([YourDate]) = MONTH(Getdate()) AND Day([YourDate]) < Day(getdate())
            THEN DATEDIFF(YEAR, [YourDate], getdate()) 
            ELSE DATEDIFF(YEAR, [YourDate], getdate())  - 1 END As Age
    FROM #YourTable
),
AgeCount
AS
(
    SELECT Age, count(*) AS [Count]
    FROM Ages
    GROUP BY Age
)
SELECT  SUM(CASE WHEN Age >= 15 and Age < 24 THEN 1 ELSE 0 END) As [15-24],
        SUM(CASE WHEN AGE >= 25 AND Age < 30 Then 1 ELSE 0 END) As [25-30],
        SUM(CASE WHEN AGE > 30 THEN 1 ELSE 0 END) AS [Over 30]
From AgeCount
;With Ages
AS
(
    SELECT CASE 
            WHEN MONTH(getdate()) > MONTH([YourDate]) THEN DATEDIFF(YEAR, [YourDate], getdate())
            WHEN Month([YourDate]) = MONTH(Getdate()) AND Day([YourDate]) < Day(getdate())
            THEN DATEDIFF(YEAR, [YourDate], getdate()) 
            ELSE DATEDIFF(YEAR, [YourDate], getdate())  - 1 END As Age
    FROM #YourTable
),
AgeCount
AS
(
    SELECT Age, count(*) AS [Count]
    FROM Ages
    GROUP BY Age
)
SELECT  SUM(CASE WHEN Age >= 15 and Age < 24 THEN 1 ELSE 0 END) As [15-24],
        SUM(CASE WHEN AGE >= 25 AND Age < 30 Then 1 ELSE 0 END) As [25-30],
        SUM(CASE WHEN AGE > 30 THEN 1 ELSE 0 END) AS [Over 30]
From AgeCount