2009-07-14 5 views
1

Supposons que j'aiannées Count SQL sur FromDate aux champs todate

> ID    FromDate   ToDate 
> --    --------   ------- 
> 1    01/01/2005   30/6/2007 
> 2    01/01/2008   31/12/2009 

Je veux compter les années qui sont inclus sur ces 2 lignes. Voici 1,5 ans pour la première rangée + 2 ans à partir de la deuxième rangée = Total de 3,5 ans. Comment puis-je faire cela avec SQL?

+0

Utiliser année et le mois DATEDIFF (utilise fin de limites année/mois) donne la ligne 1 = 2 ans/29 mois, la ligne 2 = 1 an/23 mois. Comment obtenez-vous 1,5/2 ans de s'il vous plaît? – gbn

+0

Quelle saveur SQL utilisez-vous? Serveur SQL? Oracle? MySQL? –

+0

Ne pas oublier les années bissextiles ... http://stackoverflow.com/questions/1123727/sql-count-years-on-fromdate-to-todate-fields/1123864#1123864 – RSolberg

Répondre

3

Je recommande d'utiliser 365.25 pour les jours dans la fonction SQL DateDiff pour éviter les problèmes avec l'année bissextile.

select 
    SUM((DATEDIFF(d, FromDate, ToDAte))/365.25) as 'years-count' 
from 
    mytableofdates 
0

Je pense que le mieux est d'utiliser DATEDIFF (datepart, startdate, enddate)

ID Select, DATEDIFF (mm, StartDate, EndDate)/12 de VotreTable

cela devrait donner le résultat de votre après.

Edit: En supposant SQL Server

0

Je pense que vous avez-vous des calculs faux - le premier devrait être de 2,5 ans? Dans ce cas, cela semble donner une bonne approximation de ce que vous voulez (encore une fois dans le serveur SQL)

create table YearDiff(ID int, fromDate datetime, toDate datetime) 
go 
insert into YearDiff values (1, '2005-01-01 00:00:00.000', '2007-06-30 00:00:00.000') 
insert into YearDiff values (2, '2008-01-01 00:00:00.000', '2009-12-31 00:00:00.000') 
select sum((datediff(ww, fromdate, todate))/52.0) from YearDiff 
0

Si vous utilisez Oracle:

SELECT TRUNC(SUM(MONTHS_BETWEEN(t.todate, t.fromDate))/12, 1) 
    FROM TABLE t 

Le second paramètre dans TRONQUE est le nombre de décimales places - la requête, telle quelle, serait à une décimale.