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我更新了查询。感谢您的反馈