2017-07-18 46 views
-1

年齢表の生年月日から年月日が必要です。 データを抽出するのを手伝ってもらえますか?生年月日から年月日

参照用に添付されたサンプルファイル。

enter image description here

答えて

0

みんなありがとうは、しかし答えを見つけました。

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

更新バージョン:response.Iため

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()'はやや卑劣です。 8つの呼び出しのそれぞれが異なる値を返すかもしれませんが、各インスタンスの値はすべての行に適用されます。真夜中頃に競合状態になるのではなく、値を一度取得する方がよいでしょう。 '@TodayをDate = GetDate();と宣言し、その値を一貫して使用します。 – HABO

+0

はい。私は2つの日付を比較しながら、わずかに異なるデータを取得しています。 – Chickoo

関連する問題