代码之家  ›  专栏  ›  技术社区  ›  Paul Rowland

在TSQL中,如何将int转换为datetime并给出年龄?

  •  6
  • Paul Rowland  · 技术社区  · 17 年前

    8 回复  |  直到 17 年前
        1
  •  12
  •   LukeH    17 年前

    DECLARE @d DATETIME
    SET @d = CONVERT(DATETIME, CONVERT(VARCHAR(8), 19600518), 112)
    
    SELECT DATEDIFF(year, @d, GETDATE())
        - CASE WHEN DATEADD(year, DATEDIFF(year, @d, GETDATE()), @d) <= GETDATE()
               THEN 0 ELSE 1 END AS Age
    
        2
  •  4
  •   Mark Brittingham    17 年前

    计算年龄-仅整年(例如,2009年1月1日是2008年12月31日之后的一年)。因此,如果你使用 大多数

    Select CAST(DATEDIFF(hh, [birthdate], GETDATE()) / 8766 AS int) AS Age
    

    (注意:感谢“学习”对我的原始算法进行了很好的捕捉——这是一个使用小时而不是天的修订)

    几乎

    这是一个打印出年龄的循环,表明这是有效的。

    Declare @age int;
    Declare @BirthDate datetime;
    Declare @Year int;
    Set @Year = 2008;
    WHILE (@Year > 1930)
    BEGIN
        -- Put today's date where you see '-03-18'
        SET @BirthDate = CAST(Cast(@Year as varchar(4)) + '-03-18'  AS DATETIME)
        SELECT @age=CAST(DATEDIFF(hh, @BirthDate, GETDATE()) / 8766 AS int);
        Print Cast(@Year as varchar)  + ' Age: ' + Cast(@age as varchar);
        Set @Year = @Year - 1;
    END;
    

    CAST(DATEDIFF(hh, Convert(Datetime, Convert(varchar(8), [birthdate]), 112), GETDATE()) / 8766 AS int) AS Age
    
        3
  •  2
  •   jrcs3    17 年前
    DECLARE @dateSt VARCHAR(8)
    DECLARE @startDt DATETIME
    
    -- Set the start date string
    SET @dateSt = '19600518'
    
    -- Make it a DATETIME (the ISO way)
    SET @startDt = CAST(SUBSTRING(@dateSt, 1, 4) + '-' + 
       SUBSTRING(@dateSt, 5, 2) + '-' + 
       SUBSTRING(@dateSt, 7, 2)  AS DATETIME)
    
    -- Age in Days
    SELECT DATEDIFF(D, @startDt, getdate())
    
        4
  •  1
  •   Learning    17 年前

    select datediff(YY, convert(datetime, convert(varchar, 19600518)), getdate())
    
        5
  •  1
  •   Michael Buen    17 年前
    [EDIT]
    
    -- I forgot to declare the variables
    
    declare @birthday datetime;
    set @birthday = convert(datetime,convert(varchar, 19600518), 112);
    declare @datetoday datetime;
    set @datetoday = getdate();
    
    select 
    (
    CASE
    WHEN dateadd(year, datediff (year, @birthday, @datetoday), @birthday) <= @datetoday
    THEN datediff (year, @birthday, @datetoday)     
    ELSE datediff (year, @birthday, @datetoday) - 1
    END) as age;
    
        6
  •  0
  •   Shalom Craimer    17 年前

    以下是一种简单的方法:

    CONVERT(DATETIME, CONVERT(VARCHAR(8),19600518), 112)
    

    请注意,112的“样式”只是yyyymmdd的“ISO”日期格式。(我在一些 CONVERT

        7
  •  0
  •   HLGEM    17 年前

    这就是为什么你不应该将日期存储为除日期时间数据类型之外的任何数据类型的原因。最好的解决方案是更改数据类型并转换所有日期一次(如果其中几乎没有无效的日期,也不会感到惊讶)。那么你就再也不用做这些变通方法了。

        8
  •  0
  •   Paul Rowland    17 年前

    我算出来了,结果和@Learning一样

    select dob, datediff(year, convert(datetime, convert(varchar(8),[dob])) ,getdate()) as age
    from  [mytable]
    where IsDate(convert(varchar(8),[dob])) = 1
    

    NB。我需要IsDate,因为数据中有一些无效的日期。

    编辑。这是一篇来自 SQLServerCentral on calculating age.