Sql 年龄计算查询
可能重复:Sql 年龄计算查询,sql,sql-server,Sql,Sql Server,可能重复: 在一些年龄计算的过程中。谈到SQL,我有点新手,但我的任务是挑选那些将在2013年3月31日65岁的人。到目前为止,我能够根据给定的DOB计算年龄,但是我在挑选这些人时遇到了问题。我认为这是一个简单的问题,但我被难住了,请参见sql语句。谁能给我指一下正确的方向吗 SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status, CASE WHEN DATEADD(YEAR, DATE
在一些年龄计算的过程中。谈到SQL,我有点新手,但我的任务是挑选那些将在2013年3月31日
65岁的人。到目前为止,我能够根据给定的DOB
计算年龄,但是我在挑选这些人时遇到了问题。我认为这是一个简单的问题,但我被难住了,请参见sql语句。谁能给我指一下正确的方向吗
SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status,
CASE WHEN DATEADD(YEAR, DATEDIFF (YEAR, dob, '2013/03/31'), dob) > '2013/03/31'
THEN DATEDIFF(YEAR, dob, '2013/03/31') - 1
ELSE DATEDIFF(YEAR, dob, '2013/03/31')
END AS 'Age'
FROM test_db.dbo.ip_master ip_master
下面的方法行吗?我只是将你的查询隐藏在另一个查询中,并对年龄进行了限制
select * from
(
SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status,
CASE WHEN DATEADD(YEAR, DATEDIFF (YEAR, dob, '2013/03/31'), dob) > '2013/03/31'
THEN DATEDIFF(YEAR, dob, '2013/03/31') - 1
ELSE DATEDIFF(YEAR, dob, '2013/03/31')
END AS 'Age'
FROM test_db.dbo.ip_master ip_master
)
where Age >= 65
下面的方法行吗?我只是将你的查询隐藏在另一个查询中,并对年龄进行了限制
select * from
(
SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status,
CASE WHEN DATEADD(YEAR, DATEDIFF (YEAR, dob, '2013/03/31'), dob) > '2013/03/31'
THEN DATEDIFF(YEAR, dob, '2013/03/31') - 1
ELSE DATEDIFF(YEAR, dob, '2013/03/31')
END AS 'Age'
FROM test_db.dbo.ip_master ip_master
)
where Age >= 65
将WHERE子句附加到语句中:
...
WHERE dob = '1948-03-31'
将WHERE子句附加到语句中:
...
WHERE dob = '1948-03-31'
你所做的一切都是正确的。
要单独选择,您需要一个where子句
SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status,
CASE WHEN DATEADD(YEAR, DATEDIFF (YEAR, dob, '2013/03/31'), dob) > '2013/03/31'
THEN DATEDIFF(YEAR, dob, '2013/03/31') - 1
ELSE DATEDIFF(YEAR, dob, '2013/03/31')
END AS 'Age'
FROM test_db.dbo.ip_master ip_master
WHERE dob = '1948-03-31'
你所做的一切都是正确的。
要单独选择,您需要一个where子句
SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status,
CASE WHEN DATEADD(YEAR, DATEDIFF (YEAR, dob, '2013/03/31'), dob) > '2013/03/31'
THEN DATEDIFF(YEAR, dob, '2013/03/31') - 1
ELSE DATEDIFF(YEAR, dob, '2013/03/31')
END AS 'Age'
FROM test_db.dbo.ip_master ip_master
WHERE dob = '1948-03-31'
请尝试下面的查询。。。它将完美地工作
DECLARE @CalDate datetime;
DECLARE @CurDate datetime;
Declare @count INT
SET @CalDate ='03/31/2013'
SET @count =0
SELECT @CurDate = DateAdd(Month, 1, @CalDate)
SET @count = @count + datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(@CurDate) as varchar)+'-'+cast(month(@CurDate) as varchar)+'-01' as datetime))))
SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status,DATEDIFF (yy, DOB, cast(@CalDate as DateTime) + @count) - (
CASE SIGN (MONTH (DOB) - MONTH (cast(@CalDate as DateTime) + @count))
WHEN 1 THEN
1
WHEN -1 THEN
0
WHEN 0 THEN
CASE SIGN (DAY (DOB) - DAY (@CalDate + @count))
WHEN 1 THEN
1
WHEN 0 THEN
1
ELSE
0
END
END) as AGE into #temp
FROM test_db.dbo.ip_master ip_master
select * from #temp where AGE >= 65
请尝试下面的查询。。。它将完美地工作
DECLARE @CalDate datetime;
DECLARE @CurDate datetime;
Declare @count INT
SET @CalDate ='03/31/2013'
SET @count =0
SELECT @CurDate = DateAdd(Month, 1, @CalDate)
SET @count = @count + datepart(dd,dateadd(dd,-1,dateadd(mm,1,cast(cast(year(@CurDate) as varchar)+'-'+cast(month(@CurDate) as varchar)+'-01' as datetime))))
SELECT ip_master.ssn, ip_master.firstname, ip_master.surname, ip_master.status,DATEDIFF (yy, DOB, cast(@CalDate as DateTime) + @count) - (
CASE SIGN (MONTH (DOB) - MONTH (cast(@CalDate as DateTime) + @count))
WHEN 1 THEN
1
WHEN -1 THEN
0
WHEN 0 THEN
CASE SIGN (DAY (DOB) - DAY (@CalDate + @count))
WHEN 1 THEN
1
WHEN 0 THEN
1
ELSE
0
END
END) as AGE into #temp
FROM test_db.dbo.ip_master ip_master
select * from #temp where AGE >= 65
挑出来?你不想要一个WHERE
条款吗?假设这个问题指的是今年年满65岁的人,不迟于3月31日,WHERE DateAdd(year,-65,'2013-01-01')挑出?你不想要一个WHERE
子句吗?假设这个问题是指今年不迟于3月31日年满65岁的人,WHERE DateAdd(year,-65,'2013-01-01')CEIL
不是有效的SQL Server函数。你的意思是天花
?,在INT
列上使用它有什么意义?是的,我指的是天花。年龄是整数吗?截至2013年1月31日,一个人的年龄是多少?嗯,age
是一个计算,它采用了DATEDIFF
的结果,因此是的,它是一个INT
。如果此人出生于1948-03-31,其年龄(以年计)应为64岁,但DATEDIFF
将返回65@Lamak-谢谢。我不太了解DATEDIFFCEIL
不是一个有效的SQL Server函数。你的意思是天花
?,在INT
列上使用它有什么意义?是的,我指的是天花。年龄是整数吗?截至2013年1月31日,一个人的年龄是多少?嗯,age
是一个计算,它采用了DATEDIFF
的结果,因此是的,它是一个INT
。如果此人出生于1948-03-31,其年龄(以年计)应为64岁,但DATEDIFF
将返回65@Lamak-谢谢。我对DATEDIFF了解不多,其中dob=date'1948-03-31'
,这是什么语法?@Lamak,谢谢。语法已更新为符合ANSI标准。多谢各位,我知道我想得太多了。正在尝试使用年龄列上的WHERE子句,但不确定esle在它不起作用后要做什么。WHERE dob=date'1948-03-31'
,这是什么语法?@Lamak,谢谢。语法已更新为符合ANSI标准。多谢各位,我知道我想得太多了。试图使用年龄列上的WHERE子句,但不确定esle在它不起作用后要做什么。所有额外的代码和不必要的临时表???不,我恐怕没有。@Ken White出于测试目的我使用了临时表…没有额外的编码…它对我有效…我在许多报告中使用了它…所有这些额外的代码和不必要的临时表???不,我恐怕没有。@Ken White出于测试目的我使用了临时表。。。而且没有额外的编码。。。它对我有用。。。我已经在很多报告中使用过这个。。。