2012-12-28 79 views
4
之间

可能重复:
How to calculate age in T-SQL with years, months, and days如何计算年龄/年数两个日期

一个项目我工作,我需要的时候,他们计算一个人的年龄加入系统;在网上查找后,我发现可以采取多种方式,但其中大部分在涉及闰年时都存在轻微问题。

以下解决方案是我如何计算过去/年龄的年数。希望这可以帮助别人

+0

我们可以假设我们有出生日期吗?闰年有什么问题? –

回答

12

你需要下面的方法添加到您的数据库:

CREATE FUNCTION [dbo].[fnCalAge] (@DiffFrom DATE, @DiffTo DATE) RETURNS INT 
AS 
BEGIN 
    DECLARE @NumOfYears INT 
    SET @NumOfYears = (SELECT 
         DATEDIFF(YEAR, @DiffFrom, @DiffTo) + 
         CASE 
          WHEN MONTH(@DiffTo) < MONTH(@DiffFrom) THEN -1 
          WHEN MONTH(@DiffTo) > MONTH(@DiffFrom) THEN 0 
          ELSE 
          CASE WHEN DAY(@DiffTo) < DAY(@DiffFrom) THEN -1 ELSE 0 END 
         END) 
    IF @NumOfYears < 0 
    BEGIN 
     SET @NumOfYears = 0; 
    END 

    RETURN @NumOfYears; 
END 

然后调用它在你的SQL查询,类似于以下内容:

SET DATEFORMAT dmy 

SELECT dbo.fnCalAge(CAST('20/06/1987' AS DATE), CAST('20/06/2013' AS DATE)) 
6

假设@bDate是出生日期和@today是今天的日期,然后...

Declare @bDay Date = '31 dec 2000' 
Declare @today Date = cast(getdate() as date) 
Select datediff(Year, @bDay, @today) - 
     case When datepart(dayofYear, @today) < 
        datepart(dayofYear, @bDay) Then 1 Else 0 End 
1

替换与DOB聘请的年龄。将sysdate替换为您的日期,如to_date('28 -DEC-2012'):

SELECT empno, ename, hiredate, TRUNC(MONTHS_BETWEEN(sysdate, hiredate)/12) years_of_service 
FROM scott.emp 
/