我有表人员,我有领域
pID , pName , pDateOfBirth , pCountry
现在我在数据库中有10万人或以上
问题?我想要10个国家的名字pCountry有40岁以上的人?
我的努力是
select TOP 10 Count(pid) as ratio ,PCountry, datediff(pDOB, Date.Now) as
age where age > '40' Group By country
我想要的是这个
Pak = 555
INDIA = 6666
USA= 88
Aus = 557
等
答案 0 :(得分:1)
如果我理解正确,您希望按年龄超过40岁的人数排在国家之列,因此分组应仅限于国家/地区。
<强>设置强>
-- drop table Person
create table Person
(
pID INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_Person PRIMARY KEY,
pDateOfBirth DATE,
pCountry VARCHAR(3)
)
GO
INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19740101'), 'BEL'
FROM sys.messages
GO
INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19730101'), 'NED'
FROM sys.messages
GO
INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19760101'), 'DEU'
FROM sys.messages
GO
INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19750101'), 'ROM'
FROM sys.messages
GO
INSERT INTO Person (pDateOfBirth, pCountry)
SELECT TOP 1000 DATEADD(DAY, message_id, '19740615'), 'USA'
FROM sys.messages
GO
<强>查询强>
DECLARE @today DATE = GETDATE()
DECLARE @age INT = 40
SELECT TOP 10 pCountry, COUNT(1) cnt
FROM Person
WHERE DATEDIFF(day, pDateOfBirth, @today) >= @age * 365.25
GROUP BY pCountry
ORDER BY cnt DESC
我使用了DATEDIFF
和day
选项,因为使用年份只会在年级执行差异,因此仍然会包含19761201中出生的人(这在人口统计学上并不正确)。< / p>
此外,365.25
代替365
用于弥补闰年。但是,这可能仍会导致1天的错误,具体取决于当前的日期(我认为这在讨论年龄和大数据时非常合理)。
<强> [编辑] 强>
正如dnoeth
正确指出的那样,日期差异逻辑可以被还原并因此被简化。所以,条件成为:
WHERE pDateOfBirth <= DATEADD(year, -40, @today)
答案 1 :(得分:0)
"UPDATE mineraltable "
. "SET LocationID='$LocationID', ItemTypeID='$ItemTypeID', ImageID='$ImageID', DonatorID='$DonatorID' "
. "WHERE ItemID='$ItemID'"
答案 2 :(得分:0)
评论太长了。
如果您想测量年龄,请不要使用datediff()
。正如文档所述,datediff()
计算两个日期之间的时间单位结束次数。也就是说,它返回“2015-12-31”和“2015-01-01”之间的差异。但它为'2015-01-01'和'2015-12-31'返回0。
相反,请使用dateadd()
:
where dob < daeadd(year, -40, getdate())
这适用于您可能选择的任何解决方案。