Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 年龄计算查询_Sql_Sql Server - Fatal编程技术网

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-谢谢。我不太了解DATEDIFF
CEIL
不是一个有效的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出于测试目的我使用了临时表。。。而且没有额外的编码。。。它对我有用。。。我已经在很多报告中使用过这个。。。