如何从两个日期获得月数和天数

时间:2010-09-23 17:50:40

标签: sql-server-2005 tsql

我有两张桌子:

AgeMilestones //Represents available timespans
Id int     
Description varchar //(newborn, 1 month old, 2 month old, etc.)
NbrMonths int //( 0, 1, 2, etc.)
NbrDays int //(0, 1, 2, etc.)   


Child
Id int     
DateOfBirth DateTime  

我需要获得给定孩子当前年龄的AgeMilestones。问题是真正的月份可能有28天,30天或31天。因此,如果我将 NbrMonths 转换为几天,我可能偶尔会在几天内关闭。

有没有其他方法可以使用现有的表结构更准确?

编辑:
我需要确定一个agemilesstone对应于孩子出生和今天之间存在的月/天的数量(类似于下面的内容)。如果年龄里程碑可能是3个月零15天,或者5个月零7天,我会被绊倒......

SET @Days = DateDiff(d,child.DateOfBirth, GetDate())  
SET @Months = DateDiff(m,child.DateOfBirth, GetDate()) 

SELECT * FROM AgeMileStone WHERE NbrMonths < @Months AND NbrDays < @Days 



这样的记录有问题 AgeMilestone:
Id:4
说明:“5个半月” 月份:5
天:15周

4 个答案:

答案 0 :(得分:2)

使用datediff(month, DOB, getdate())很容易。

这样的事情:

declare @dob datetime = getdate() - 123; --born 123 days ago

select cast(datediff(month, @dob, getdate()) as varchar) + ' month old'
,cast(datediff(day, @dob, getdate()) as varchar) + ' days old'

<强>更新

declare @dob datetime;
set @dob = getdate() - 125;

select 
datediff(month, @dob, getdate()) [Months], 
datediff(day, dateadd(month, datediff(month, @dob, getdate()), @dob), getdate()) [Offset Days]

答案 1 :(得分:1)

我建议使用这样的东西:

DATEPART(Month, NOW())
DATEPART(DAY, NOW())

尝试使用

从子c中选择datepart(dayofyear,c.DateOfBirth)为'doy'

答案 2 :(得分:1)

这是一个使用您拥有的AgeMilestones表和DATEADD函数的查询,该函数返回特定日期出生的孩子的里程碑列表。

-- setup the AgeMilestone table with some initial data
CREATE table AgeMilestone (milestone_month int, milestone_name varchar(50))
insert into AgeMilestone (milestone_month, milestone_name) values (1, '1 month')
insert into AgeMilestone (milestone_month, milestone_name) values (2, '2 month')
insert into AgeMilestone (milestone_month, milestone_name) values (3, '3 month')
insert into AgeMilestone (milestone_month, milestone_name) values (4, '4 month')
...
insert into AgeMilestone (milestone_month, milestone_name) values (12, '12 month')
insert into AgeMilestone (milestone_month, milestone_name) values (24, '24 month')

Declare @DOB DATETIME = '1/14/2009'
SELECT 
     milestone_month, milestone_name
FROM AgeMilestone
where DATEADD(month, milestone_month, @DOB) <= GETDATE()

答案 3 :(得分:1)

我相信这可以解决这个问题,因为DATEADD函数会在给定出生日期后适当添加月份和日期:

declare @AgeMilestones table (
    NbrMonths int not null,
    NbrDays int not null,
    [Description] varchar(64) not null
)

declare @Child table (
    ChildId int not null identity,
    Name varchar(32) not null,
    DateOfBirth datetime not null
)

insert @AgeMilestones values (5, 15, '5 and 1/2 months')
insert @AgeMilestones values (0, 0, 'newborn')

insert @Child values ( 'Yearling', '2010-01-01' )
insert @Child values ( 'Newborn', GETDATE() )

declare @currentChild int = 2

select
    m.*
from @Child c
inner join @AgeMilestones m
    on dateadd(month, m.NbrMonths, dateadd(day, m.NbrDays, c.DateOfBirth)) <= getdate()
where c.ChildId = @currentChild