2009-10-26 6 views
0

J'ai fait une bonne recherche ici, mais je ne vois rien qui me vienne en tête pour celui-ci.Requête SQL incluant le calcul du temps

Fondamentalement, j'ai un appel de table Diaries, cela contient des champs tels que StartTime EndTime, j'ai besoin de faire un calcul qui calcule la différence en minutes entre StartTime et EndTime. alors pour chaque rangée qui correspond ce jour je dois additionner le résultat en minutes.

Quelque chose comme:

Select DiaryID, TotalMinutes 
from (Select (EndTime - StartTime)/60 AS SubTotalMins 
     from Diary Where ID = Diary.ID) AS FirstSelect 
    (Sum(FirstSelect.SubTotalMins) As TotalMinutes 
Where ID = Diary.ID 

Ce qui précède est infect bien sûr, mais vous pouvez voir ce que je suis en train de travailler.

Pour chaque ligne, calculez la différence entre End et Start en minutes. Pour toutes les lignes qui correspondent à la somme de la clause where. Renvoyez la somme.

Des idées?

Cordialement

+0

pouvez-vous ajouter le schéma de la table s'il vous plaît et dire quelle plateforme c'est? – gbn

Répondre

3

Je ne suis pas sûr qu'il est spécifié dans la norme SQL, mais la plupart des implémentations de SQL ont une sorte de fonction pour déterminer les intervalles. Cela va vraiment se résumer à la saveur de SQL que vous utilisez.

Si vous travaillez avec Oracle/PLSQL:

SELECT NumToDSInterval(enddate- startdate, 'MINUTE') FROM MyTable 

Dans SQL Server/T-SQL:

SELECT DateDiff(n, startdate, enddate) FROM MyTable 

MySQL:

SELECT SubTime(enddate, startdate) FROM MyTable; 

Je suis sûr il y en a un pour SQLite et PostGre et toute autre saveur.

+0

Merci DateDiff était assez :-) la fonction parfaite pour ce dont j'avais besoin le reste est facile. Merci – Reallyethical

+1

Si T-SQL est la saveur avec laquelle vous travaillez, assurez-vous de regarder également la solution de gbn. La méthode qu'il utilise groupe par date est de loin la plus efficace de son genre. –

2

Si je comprends bien (pour SQL Server au moins) ...

SELECT 
    SUM(DATEDIFF(minute, StartTime, EndTime)), 
    DATEADD(DAY, DATEDIFF(DAY, 0, StartTime), 0) AS [Date] 
FROM 
    Diary 
WHERE 
    DiaryID = @ID 
GROUP BY 
    DiaryID /* in case for all DiaryIDs */, 
    DATEADD(DAY, DATEDIFF(DAY, 0, StartTime), 0) 

Note: cela supprime la composante temporelle d'une valeur "datetime". Fonctionne en calculant le nombre de jours depuis zéro (= 01 Jan 1900). It's the most efficient

DATEADD(DAY, DATEDIFF(DAY, 0, StartTime), 0) 

DATEDIFF in MSDN

+1

Étant donné le manque de familiarité apparent de l'OP avec DateDiff, je suggère d'ajouter une explication de ce que fait DATEADD (DAY, DATEDIFF (DAY, 0, StartTime), 0). –

+0

C'est une fonction que je n'avais pas rencontrée auparavant, mais qui fonctionne merveilleusement maintenant. Merci. juste besoin de travailler sur la façon d'accepter la réponse. – Reallyethical

+0

@Jeremy: bon point, ajouté – gbn