2010-09-23 7 views
3

J'ai deux tables:Comment obtenir Nombre de mois et Jours De deux dates

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 

Je dois obtenir les AgeMilestones qu'un enfant donné a actuellement passé l'âge. Le problème est qu'un vrai mois peut avoir 28 jours, 30 jours ou 31 jours. Donc, si je convertis NbrMonths en jours, je peux parfois être absent de quelques jours.

Existe-t-il un autre moyen de faire cela qui serait plus précis en utilisant la structure de table existante?

EDIT:
Je dois comprendre ce que agemilesstone correspond au nombre de mois/jours qui existent dans le temps entre l'enfant est né et aujourd'hui (quelque chose de similaire à ci-dessous). Je reçois trébuché dans les cas où une étape d'âge peut être 3 mois et 15 jours, ou 5 mois et 7 jours ...

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

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


problème avec des disques comme
AgeMilestone:
Id: 4
description: "5 et 1/2 mois"
mois: 5
Jours: 15

+0

Ne pas oublier qu'un mois peut avoir 29 jours aussi. Pas très souvent, mais ça arrive. J'ai entendu dire que des bébés pouvaient naître ce jour-là, mais je n'en ai pas la preuve. –

+0

Vous le savez déjà, je ne reçois pas votre question mise à jour. –

+0

Je suppose que je sais de quoi vous parlez ... Vous voulez dire que NbrDays sont en réalité des jours compensés, pas des jours totaux depuis la date de naissance, n'est-ce pas? –

Répondre

1

Je crois que cela résout parce que la fonction DATEADD prendra soin d'ajouter les mois et les jours de manière appropriée compte tenu de la date de naissance de départ:

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 
+0

Je pense que vous devriez ajouter des jours après que vous avez ajouté des mois et pas l'inverse. –

+0

Je ne suis pas sûr que cela aurait de l'importance – Dave

+0

... en raison de DOB au milieu du mois, je suppose que vous pourriez tronquer la date de naissance au premier du mois, puis ajouter les mois puis ajouter les jours DOB et les NbrDays – Dave

2

C'est assez facile à faire en utilisant datediff(month, DOB, getdate()).

Quelque chose comme ceci:

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' 

Mise à jour

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] 
+0

Merci pour la réponse. Je peux obtenir le nombre de jours et le nombre de mois à partir de la dateofbirth en utilisant datediff mais j'ai besoin de trouver la pierre de mile d'âge correspondant. J'ai édité mon post original pour essayer de donner une meilleure idée de ce que j'essaie de faire. – AGoodDisplayName

+0

+1 Merci encore, cela m'aurait permis d'arriver où je voulais, mais la solution de Dave est exactement ce dont j'avais besoin. – AGoodDisplayName

1

je suggère utiliser quelque chose comme ceci:

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

essayez d'utiliser

SELECT datepart (dayofyear, c.DateOfBirth) comme « doy » de l'enfant c

1

Voici une requête qui utilise la table AgeMilestones que vous avez et la fonction DATEADD, qui renvoie la liste des jalons pour un enfant né sur une jour particulier.

-- 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() 
Questions connexes