Question

Dans une base de données mssql 2008, j'ai un champ temporel dans lequel je souhaite faire quelque chose qui a pour effet:

Timespent = x.sum(x => x.AmountOfTime);

Où AmountOfTime est un champ temporel MSSQL. Sum semble ne fonctionner que sur des décimales, comment puis-je ajouter ces colonnes?

Était-ce utile?

La solution

Vous voudrez probablement convertir les périodes en intervalles - si nécessaire, en soustrayant l'heure de début de l'heure de fin. Notez que le type TIME représente un instant, pas une durée. En SQL standard, vous voulez INTERVAL HEURE À SECOND. Je ne suis pas sûr que Microsoft le prenne en charge - il existe d’autres SGBD majeurs qui ne le font pas. Si vous êtes coincé avec TIME, vous devriez pouvoir soustraire TIME des valeurs et obtenir quelque chose de réalisable (ce serait un INTERVAL).

Un avantage particulier des intervalles est que vous pouvez effectivement les additionner via SUM.

Pour plus de détails, vous pouvez utiliser bash manuellement MSDN (ou via Google) aussi bien que moi.

Autres conseils

Si la construction SQL ne prend pas cela en charge, vous ne pouvez pas ... Pourquoi ne créez-vous pas un champ spécial comportant une représentation numérique de l'heure et que vous pourrez ensuite l'ajouter ensemble à l'aide de SQL.

public static class Extentions
{
    public static TimeSpan Sum<T>(this IEnumerable<T> items, Func<T, TimeSpan> selector)
    {
        var summ = TimeSpan.Zero;
        foreach(T item in items)
        {
            summ += selector(item);
        }
        return summ;
    }
}

var timespent = foo.Sum(f => f.finishdatetime - f.startdatetime);

J'ai résolu ce problème en utilisant la méthode suivante, étant donné que vous avez une date / heure de début et de fin sur votre table:

public TimeSpan AmountOfTime(IQueryable<Something> iq)
{
    TimeSpan ts = TimeSpan.Zero;
    foreach (Something a in iq.ToList())
        ts += (a.finishdatetime - a.startdatetime);
    return ts
}

Ensuite, vous pouvez l'utiliser pour obtenir le nombre total d'heures:

double foo = AmountOfTime(datacontext.Where(conditions)).TotalHours;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top