7
votes

Comment vérifier si une gamme DateTime est dans une autre gamme DateTime de 3 mois

Bonjour, j'ai une date de début et une date de fin par enregistrement dans une DB.

J'ai besoin de vérifier pour voir où la période tombe dans une période de 2 ans divisée en deux lots de trimestres puis affiche les quartiers chaque enregistrement tombe.

Le quart 1 comprend le 09 juin, Jul 09, août 09
Le quart 2 comprend le 09 septembre, 09 octobre 09 nov. Le trimestre 3 comprend le 09 décembre, le 10 janvier, 10 février
Le quart 4 comprend le 10 mars, 10 avril du 10 mai
Quaretr 5 comprend le 10 juin 10 juillet ...

E.g. 01/10/09 - 01/06/10 tomberait dans les quartiers 2, 3, 4 et 5

Je suis très nouveau à .NET afin que tous les exemples seraient très appréciés.


1 commentaires

Je serais bien si vous marquez une réponse qui vous résolvez de problème comme "réponse acceptée"


5 Réponses :


0
votes

Vous devrez peut-être jeter un coup d'œil à: http://msdn.microsoft.com/en-us/library/03ybds8y (v = vs.100) .aspx

Ceci peut vous démarrer P>

Dictionary<int, int> quarter = new Dictionary<int, int>();
quarter.Add(1,1);  //of the format Add(month,quarter)
quarter.Add(2,1);
...


0 commentaires

0
votes
    private void Form1_Load(object sender, EventArgs e)
    {
        DateTime[,] ranges = new DateTime[3,2];
        //Range 1 - Jan to March
        ranges[0, 0] = new DateTime(2010, 1, 1);
        ranges[0, 1] = new DateTime(2010, 3, 1);
        //Range 2 - April to July
        ranges[1, 0] = new DateTime(2010, 4, 1);
        ranges[1, 1] = new DateTime(2010, 7, 1);
        //Range 3 - March to June
        ranges[2, 0] = new DateTime(2010, 3, 1);
        ranges[2, 1] = new DateTime(2010, 6, 1);

        DateTime checkDate = new DateTime(2010, 4, 1);
        string validRanges = string.Empty;

        for (int i = 0; i < ranges.GetLength(0); i++)
        {
            if (DateWithin(ranges[i,0], ranges[i,1], checkDate))
            {
                validRanges += i.ToString() + " ";
            }
        }
        MessageBox.Show(validRanges);
    }

    private bool DateWithin(DateTime dateStart, DateTime dateEnd, DateTime checkDate)
    {
        if (checkDate.CompareTo(dateStart) < 0 || checkDate.CompareTo(dateEnd) > 0)
        {
            return false;
        }
        return true;
    }

0 commentaires

0
votes

Vous appelez intervalles de suivi comme suit:

private List<DateTime> IntervalInQuarters(DateTime myStartDate, DateTime myEndDate)
{
    DateTime quarterStart = new DateTime(2006, 06, 01);
    DateTime nextQuarterStart = new DateTime(2006, 09, 01);
    DateTime finalDate = new DateTime(2011, 01, 01);
    List<DateTime> foundQuarters = new List<DateTime>();

    while (quarterStart < finalDate)
    {
        // quarter intersects interval if:
        // its start/end date is within our interval
        // our start/end date is within quarter interval
        DateTime quarterEnd = nextQuarterStart.AddDays(-1);
        if (DateInInterval(myStartDate, quarterStart, quarterEnd) ||
            DateInInterval(myEndDate, quarterStart, quarterEnd) ||
            DateInInterval(quarterStart, myStartDate, myEndDate) ||
            DateInInterval(quarterEnd, myStartDate, myEndDate))
        {
            foundQuarters.Add(quarterStart);
        }

        quarterStart = nextQuarterStart;
        nextQuarterStart = nextQuarterStart.AddMonths(3);
    }

    return foundQuarters;
}

private bool DateInInterval(DateTime myDate, DateTime intStart, DateTime intEnd)
{
    return ((intStart <= myDate) && (myDate <= intEnd));
}


0 commentaires

0
votes

Si vous souhaitez comparer deux dates, vous devez déterminer le premier jour du trimestre correspond à toutes ces dates, vous pouvez également comparer ces deux dates: xxx

produire xxx

édité : J'ai corrigé une erreur de la première version. Maintenant, cela devrait fonctionner correctement.


0 commentaires

2
votes

Cela devrait également fonctionner pour vous aussi.

        List<Range> ranges = new List<Range>();

        ranges.Add(new Range(DateTime.Now, DateTime.Now.AddMonths(3)));
        ranges.Add(new Range(DateTime.Now.AddMonths(3), DateTime.Now.AddMonths(6)));

        Range test = new Range(DateTime.Now.AddMonths(1), DateTime.Now.AddMonths(2));

        var hits = ranges.Where(range => range.Contains(test));

        MessageBox.Show(hits.Count().ToString());


1 commentaires

Simple, rapide, élégant et super facile à utiliser. +1