Tsql 自出生日期起的年、月和日表

Tsql 自出生日期起的年、月和日表,tsql,Tsql,我需要从年龄表中的出生日期开始的年、月和日列。 你能帮我提取数据吗 附件样本文件供参考 更新版本: DECLARE @today DATETIME; SET @today = GETDATE(); DECLARE @dates TABLE ( DOB DATETIME ); INSERT INTO @dates VALUES ( '2016-11-02' ), ( '2015-03-26' ), ( '2010-11-20' ), ( '201

我需要从年龄表中的出生日期开始的年、月和日列。 你能帮我提取数据吗

附件样本文件供参考

更新版本:

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;

谢谢大家的回复。不过我找到了答案

   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

天数应为16、22和28。试试“2017-06-17”。应该是1个月1天而不是1个月0天提示:
GetDate()
有点狡猾。您进行的八个调用中的每一个都可能返回不同的值,但每个实例的值将应用于所有行。与其在午夜前后有竞争条件,不如只获取一次值,例如
declare@Today as Date=GetDate(),然后在整个过程中使用该值。是。我在比较两个日期时得到的数据略有不同。@johncapelletti我更新了查询。感谢您的反馈