【问题标题】:Age Calculation Query [duplicate]年龄计算查询[重复]
【发布时间】:2013-01-22 17:56:47
【问题描述】:

可能重复:
How to calculate age in T-SQL with years, months, and days
calculating age from sysdate and birthdate using SQL Server

在一些年龄计算的过程中。当谈到 SQL 时,我有点新手,但我的任务是挑选出从 31 March 2013 开始会变成 65yrs 的人。到目前为止,我能够根据给定的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

【问题讨论】:

  • 单挑?你不想要一个WHERE 子句吗?
  • 假设问题是指今年 65 岁的人,不迟于 3 月 31 日,where DateAdd( year, -65, '2013-01-01' ) <= DoB and DoB <= DateAdd( year, -65, '2013-03-31' ) 应该这样做。

标签: sql sql-server


【解决方案1】:

在语句中添加 WHERE 子句:

...
WHERE dob = '1948-03-31'

【讨论】:

  • WHERE dob = date '1948-03-31'?,这是什么语法?
  • @Lamak,谢谢。语法已更新为符合 ANSI。
  • 非常感谢大家,我知道我想太多了。试图在 Age 列上使用 WHERE 子句,但不确定 esle 在它不起作用后该怎么做。
【解决方案2】:

以下会做吗?我只是将您的查询隐藏在另一个查询中并应用了年龄限制。

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

【讨论】:

    【解决方案3】:

    试试下面的查询...它将完美运行...

       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
    

    【讨论】:

    • 所有额外的代码一个不必要的临时表???不,恐怕不会。
    • @Ken White 用于测试目的,我使用了 Temp 表......并且没有额外的编码......它对我有用......我已经将它用于许多报告......跨度>
    【解决方案4】:

    无论你做什么都是正确的。 为了挑出你需要一个 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'
    

    【讨论】:

    • CEIL 不是有效的 SQL Server 函数。您是说CEILING 吗?在INT 列上使用它有什么意义?
    • 是的,我的意思是天花板。年龄是 INT 吗?到 2013 年 1 月 31 日,一个人的年龄是多少?
    • 嗯,Age 是采用DATEDIFF 的结果的计算,所以是的,它是INT。如果该人出生于1948-03-31,则该人的年龄应为 64,但DATEDIFF 将返回 65
    • @Lamak- 谢谢。我不太了解 DATEDIFF
    猜你喜欢
    • 2022-01-19
    • 2013-06-29
    • 2023-03-06
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多