在几个月的sql中计算出人的年龄

时间:2013-11-13 10:50:46

标签: sql stored-procedures

使用以下作为基础,我将如何计算一个人的月龄,我不知道如何改变这一点,所以几个月是cacualated而不是几年

          IF cast(datepart(m, GETDATE()) as int) > cast(datepart(m,@in_DOB) as int)
    SET @age = cast(datediff(yyyy,@in_DOB,GETDATE()) as int)
      else
    IF cast(datepart(m,GETDATE()) as int) = cast(datepart(m,@in_DOB) as int)

    IF datepart(d,GETDATE()) >= datepart(d,@in_DOB)

    SET @age = cast(datediff(yyyy,@in_DOB,GETDATE()) as int)

    ELSE

    SET @age = cast(datediff(yyyy,@in_DOB,GETDATE()) as int) -1

    ELSE

    SET @age = cast(datediff(yyyy,@in_DOB,GETDATE()) as int) - 1

    RETURN @age

3 个答案:

答案 0 :(得分:0)

今天是我的生日:)我已经SELECT DATEDIFF(MONTH, '13 Nov 1963', GetDate())个月了。哎呀,啤酒已经太多了。

<强>更新

DECLARE @birthdate datetime
DECLARE @months INT
SELECT @birthdate =  '13 Nov 1963'

SELECT @months = DATEDIFF(MONTH, @birthdate, GETDATE()) - CASE WHEN DAY(@birthdate) > DAY( GETDATE()) THEN 1 ELSE 0 END

SELECT  @months

答案 1 :(得分:0)

这有点拗口,但我们只是使用DATEDIFF 1 得到粗略的估计 - 然后我们调整它,如果它错了:

select @age = DATEDIFF(month,@in_DOB,CURRENT_TIMESTAMP) -
    CASE WHEN DATEADD(month,DATEDIFF(month,@in_DOB,CURRENT_TIMESTAMP),@in_DOB)
              > CURRENT_TIMESTAMP
         THEN 1 ELSE 0 END

1 这是粗略的,因为DATEDIFF告诉你两个日期之间发生的过渡的数量,而不是某些人可能会想到的。这意味着根据此功能,9月30日至10月1日之间的月份差异为1。

因此,最终报告的值比两个日期之间的直观“月差异”高1。

答案 2 :(得分:0)

您需要始终在db中保存UTC日期。会给你省去很多麻烦。

select DATEDIFF(second,@in_DOB,GETUTCDATE())/(30.5*24*60*60.0) --days 30.5 avg of 30 and 31