Sql server 两个日期范围之间的SQL计数期限
我试图计算数据库中活动记录的年龄,从当前日期到可能的过去日期。 以下是可能的输出: 15至24岁 十二, 24至30岁 十五 30岁及以上 二十五 还有年龄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
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