【问题标题】:How to calculate age (in years) based on Date of Birth and getDate()如何根据出生日期和 getDate() 计算年龄(以年为单位)
【发布时间】:2010-12-07 00:36:09
【问题描述】:

我有一张表格,列出了人们的出生日期(目前是 nvarchar(25))

如何将其转换为日期,然后计算他们的年龄?

我的数据如下所示

ID    Name   DOB
1     John   1992-01-09 00:00:00
2     Sally  1959-05-20 00:00:00

我想看看:

ID    Name   AGE  DOB
1     John   17   1992-01-09 00:00:00
2     Sally  50   1959-05-20 00:00:00

【问题讨论】:

  • 为什么要使用 nvarchar(25) 将日期值存储为字符串,而不是使用数据库的本机日期或日期时间类型?
  • 该问题被标记为 2005 而不是 2008,因此本机“日期”类型不可用,但肯定是日期时间,并且可以争论 SmallDateTime,因为您不需要准确性。
  • 嗨,将日期保留为 varchar 的原因是因为我是从非 SQL 服务器模式导入的,将它们导入为 datetime(和其他日期格式)和 varchar 转换时存在一些问题好的
  • @James.Elsey,所以您在导入时遇到了问题,因此所有日期都有效吗?除非您使用 datetime 或 smalldatetime 和 varchar,否则永远无法确定,您可以让您的导入工作,但还有其他问题。另外,我永远不会存储年龄,它每天都在变化,使用视图
  • @KM 是的,将该数据作为日期导入时存在问题,当时唯一可行的解​​决方案是将它们作为 nvarchars 导入。此选择将成为夜间工作的一部分,因此存储年龄不应该成为问题

标签: sql sql-server tsql


【解决方案1】:
select datediff(day,'1991-03-16',getdate()) \\for days,get date refers today date
select datediff(year,'1991-03-16',getdate()) \\for years
select datediff(month,'1991-03-16',getdate()) \\for month

【讨论】:

    【解决方案2】:

    你应该通过以下方式计算年数:-

    select cast(datediff(DAY, '2000-03-01 10:00:01', '2013-03-01 10:00:00') / (365.23076923074) as int) as 'Age'
    

    这很容易......

    【讨论】:

      【解决方案3】:

      我们在这里使用了类似的东西,然后取平均年龄:

      ROUND(avg(CONVERT(int,DATEDIFF(hour,DOB,GETDATE())/8766.0)),0) AS AverageAge
      

      注意,ROUND 是在外面而不是在里面。这将使 AVG 更准确,我们只 ROUND 一次。也让它更快。

      【讨论】:

        【解决方案4】:
        select DATEDIFF(yy,@DATE,GETDATE()) -
        case when DATEPART(mm,GETDATE())*100+DATEPART(dd,GETDATE())>=
        DATEPART(mm,@DATE)*100+DATEPART(dd,@DATE) THEN 0
        ELSE 1 END 
        

        【讨论】:

          【解决方案5】:
          SELECT CAST(DATEDIFF(dy, @DOB, GETDATE()+1)/365.25 AS int)
          

          【讨论】:

          • 我看到了反对票,但我没有看到证明这被破坏的例子。
          【解决方案6】:

          你应该使用
          从表名中选择 FLOOR(DATEDIFF(CURDATE(),DATE(DOB))/365.25);
          这里 CURDATE() 使用当前日期,您可以以 'yyyy-mm-dd' 格式给出自己的日期 DATE(DOB) 从 DATETIME 格式的列中提取 yyyy-mm-dd 年份 这里 DOB 是您的列名(但在您的情况下,您应该更改表以将数据类型修改为 DATETIME,即 nvarchar) 笔记- 这个查询在mysql中使用 全年这个回归年龄

          【讨论】:

            【解决方案7】:
            DECLARE @yourBirthDate DATETIME = '1987-05-25'
            SELECT YEAR(DATEADD(DAY, DATEDIFF(DAY, @yourBirthDate, GETDATE()), CAST('0001-01-01' AS DATETIME2))) - 1
            

            【讨论】:

              猜你喜欢
              • 2013-10-31
              • 1970-01-01
              • 1970-01-01
              • 2014-04-04
              • 1970-01-01
              相关资源
              最近更新 更多