我有两张桌子:
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周
答案 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