2017-07-18 29 views

回答

0

感謝大家的response.I找到了答案,雖然。

create table Test_table 
(
Date_Of_Birth datetime, 
received_Date datetime, 
) 

insert into Test_table values 
('2016-11-02 00:00:00','2017-7-15 00:00:00'), 
('2015-7-17 00:00:00','2017-7-13 00:00:00'), 
('2015-3-26 00:00:00','2017-7-3 00:00:00') 
GO 

;with cte_years as 
(
select case when 
DATEADD(year,DATEDIFF(Year,Date_Of_Birth,received_Date),Date_Of_Birth)> 
received_Date then DATEDIFF(Year,Date_Of_Birth,received_Date)-1 
    else DATEDIFF(Year,Date_Of_Birth,received_Date) end as Years, 
Date_Of_Birth, 
received_Date 
from Test_Table 
), 
cte_months as 
(
select 
Years, 
case when 
    DATEADD(month,DATEDIFF(month,Date_Of_Birth,received_Date),Date_Of_Birth)> 
    received_Date 
    then DATEDIFF(month,Date_Of_Birth,received_Date)-1-Years*12 
    else DATEDIFF(month,Date_Of_Birth,received_Date)-Years*12 end as 
Months,Date_Of_Birth,received_Date 
from cte_years 
) 
select Date_Of_Birth,received_Date,cast(Years as varchar)+' Years 
'+cast(Months as varchar)+' Months 
'+cast(datediff(day,dateadd(month,12*Years+Months,Date_Of_Birth), 
received_Date) as varchar)+' Days ' as Age from cte_months 
1

更新版本:

DECLARE @today DATETIME; 
SET @today = GETDATE(); 
DECLARE @dates TABLE (DOB DATETIME); 
INSERT INTO @dates 
VALUES ('2016-11-02'), 
     ('2015-03-26'), 
     ('2010-11-20'), 
     ('2017-06-17'); 
SELECT DOB , 
     DATEDIFF(YEAR, DOB, @today) AS [Age] , 
     DATEDIFF(YEAR, DOB, @today) 
     - CASE WHEN MONTH(DOB) > MONTH(@today) 
        OR MONTH(DOB) = MONTH(@today) 
        AND DAY(DOB) > DAY(@today) THEN 1 
       ELSE 0 
      END AS Years , 
     DATEDIFF(MONTH, 
       DATEADD(YEAR, 
         DATEDIFF(YEAR, DOB, @today) 
         - CASE WHEN MONTH(DOB) > MONTH(@today) 
            OR MONTH(DOB) = MONTH(@today) 
            AND DAY(DOB) > DAY(@today) THEN 1 
           ELSE 0 
          END, DOB), @today) 
     - CASE WHEN DAY(DOB) > DAY(@today) THEN 1 
       ELSE 0 
      END AS Months , 
     DATEDIFF(DAY, 
       DATEADD(MONTH, 
         DATEDIFF(MONTH, 
            DATEADD(YEAR, 
              DATEDIFF(YEAR, DOB, @today) 
              - CASE WHEN MONTH(DOB) > MONTH(@today) 
                 OR MONTH(DOB) = MONTH(@today) 
                 AND DAY(DOB) > DAY(@today) 
               THEN 1 
               ELSE 0 
              END, DOB), @today) 
         - CASE WHEN DAY(DOB) > DAY(@today) THEN 1 
           ELSE 0 
          END, 
         DATEADD(YEAR, 
           DATEDIFF(YEAR, DOB, @today) 
           - CASE WHEN MONTH(DOB) > MONTH(@today) 
              OR MONTH(DOB) = MONTH(@today) 
              AND DAY(DOB) > DAY(@today) THEN 1 
             ELSE 0 
            END, DOB)), @today) AS Days 
FROM @dates; 

enter image description here

+1

天應該是16,22和28.試試'2017-06-17'。應該是1個月1天1個月0天 –

+1

提示:'GetDate()'有點鬼鬼祟祟。您所做的八個調用中的每一個都可能返回不同的值,但每個實例的值將應用於所有行。而不是在午夜左右出現競爭狀況,最好是一次獲得該值,例如, '將@Today聲明爲Date = GetDate();',然後在整個過程中使用該值。 – HABO

+0

是的。比較兩個日期時,我得到的數據略有不同。 – Chickoo