Date performance boucle moine consomable

Signaler
Messages postés
21
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
20 avril 2010
-
Messages postés
21
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
20 avril 2010
-
Bonjour à tous
si il y'a quelqu'un qui peur m'aider à ce coup la

je veux créer une méthode qui vérifie la présence d'un ensembles des date dans une table sqlserver dés le 1er janvier jusqu'au aujourd'hui à l'aide d'une boucle

j'ai essayé des tas de truc mais sans aucun résultat merci de m'aider

while ((string.Format("{0:MM/dd/yyyy HH:mm:ss.fff}", DateTime.Today.AddDays(-j)).CompareTo(dt.ToString())) <= 0 && (string.Format("{0:MM/dd/yyyy HH:mm:ss.fff}", DateTime.Today.AddDays(-j)).CompareTo(setter.Tables["consultants"].Rows[b][2].ToString()) <= 0))
{
if(jours.Contains(DateTime.Parse(string.Format("{0:MM/dd/yyyy HH:mm:ss.fff}", DateTime.Today.AddDays(-j).AddHours(1)),new System.Globalization.CultureInfo("en-US"))))
{
if (DateTime.Today.AddDays(-j).DayOfWeek != DayOfWeek.Sunday && DateTime.Today.AddDays(-j).DayOfWeek != DayOfWeek.Saturday)
{
nodechild = new TreeNode(DateTime.Today.AddDays(-j).ToString("ddd dd/MM/yyyy"), "", "~/App_Styles/Images/element.png");
h++;
nnnode.ChildNodes.Add(nodechild);
}
}
read.Close();
j++;
}

7 réponses

Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Salut

Tout d'abord, quand tu insères du code, merci d'utiliser les tags prévus à cet effet accessibles via la barre d'outil au dessus de la textbox.

Ensuite, plutôt que de comparer des dates que tu formates en string, compare plutôt des DateTime :
DateTime.Today.AddDays(-j) <= dt...
(Ou DateTime.Parse(dt.ToString()) si dt n'est pas un DateTime)

Enfin, on ne comprends ni ce que tu cherches à faire, ni ce que fait ton code. Ton code ne possède aucun commentaire. Tu utilises des variables comme j, sans indiquer ce à quoi elle correspond.
Essaie d'être plus précis et plus clair en exposant ton problème.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
21
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
20 avril 2010

ce que je veux tous simplement un alternative d'une boucle de 1er janvier à aujourd'hui qui cherche dans la base données des jours qui ne sont pas enregistrées et les afficher

et merci krimog
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Ah, alors tu peux faire un truc comme ça :
// Boucle parcourant toutes les dates du 01/01/2010 à aujourd'hui inclus
for(DateTime date = new DateTime(2010, 1, 1); date <= DateTime.Today; date = date.AddDays(1))
{
    // On parcours le tableau pour savoir s'il contient la date en cours
    bool contientLaDate = false;
    foreach(DataRow ligne in setter.Tables["consultants"].Rows)
    {
        if(DateTime.Parse(ligne[2].ToString()) == date)
        {
            contientLaDate = true;
            break; // La table contient la date, on peut sortir de la boucle foreach
        }
    }
    if(!contientLaDate)
    {
        MessageBox.Show(string.format("La date {0} n'apparaît pas dans la base.", date));
    }
}


Et si tu préfères directement taper dans la base en SQL :

SqlConnection connexion = new SqlConnection(connectionString);
SqlCommand commande = new SqlCommand();
commande.Connection = connexion;
commande.CommandText "SELECT Count(*) FROM nomDeLaTable WHERE nomDuChampDate @date";
connexion.Open();

// Boucle parcourant toutes les dates du 01/01/2010 à aujourd'hui inclus
for(DateTime date = new DateTime(2010, 1, 1); date <= DateTime.Today; date = date.AddDays(1))
{
    // On regarde si la date est présente dans la base

    // On efface les paramètres précédents de la requête
    commande.Parameters.Clear();
    // On met la nouvelle valeur de date dans le paramètre @date
    commande.Parameters.Add(new SqlParameter("@date", date));

    // On exécute la requête SQL pour savoir combien de fois cette date apparaît dans la base
    string nombre = commande.ExecuteScalar().ToString();

    // Si elle apparaît 0 fois
    if(nombre == "0")
    {
        MessageBox.Show(string.format("La date {0} n'apparaît pas dans la base.", date));
    }
}


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Oups, j'ai oublié de connexion.Close(); à la fin du code !!

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
21
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
20 avril 2010

merci krimog mais je me demande si il y a une autre méthode sans passé par la boucle date sinon ça sera très lourd après 15 mois ou bien plus
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Alors, la seule solution que je voie pour éviter de faire une boucle ne fonctionne que si une table de ta base contient toutes les dates, au moins entre le 1er janvier et aujourd'hui.
Dans ce cas, tu peux faire une requête comme ça (je n'ai pas testé) :
Table contenant la liste à vérifier : Table1 (champ DatesAVerifier)
Table contenant toutes les dates : Table2 (champ ToutesDates)

SELECT Table2.ToutesDates AS DatesManquantes
FROM Table2 LEFT OUTER JOIN Table1 ON Table2.ToutesDates = DatesAVerifier
WHERE Table1.DatesAVerifier IS NULL AND Table2.ToutesDates BETWEEN '01/01/2010' AND GETDATE()

Une seule requête et pas de boucle
Nécessite une table contenant toutes les dates

Sinon, je vois deux autres solutions :

commande.CommandText = "SELECT DISTINCT DatesAVerifier FROM Table1 WHERE DatesAVerifier BETWEEN '01/01/2010' AND GETDATE()";
SqlDataReader reader = commande.ExecuteReader();
DateTime date = new DateTime(2010, 1, 1);
while(reader.Read())
{
    while(DateTime.Parse(reader[0].ToString()) != date)
    {
        MessageBox.Show(string.Format("La date {0} n'apparaît pas dans la base.", date));
        date = date.AddDays(1);
    }
    date = date.AddDays(1);
}

On tape directement dans la base de données, via une seule requête
On a forcément n itérations de la boucle

La dernière solution consiste à compter le nombre de dates dans ta base sur la durée. Si c'est le bon nombre, c'est qu'il ne manque rien. Sinon, tu divises en 2 ta plage de dates, et tu recommences la vérification, jusqu'à trouver les périodes (de peut-être un seul jour) où tous les jours manquent.
Exemple : 0 1 2 5 6 7 8 9
Etape 1 : entre 0 et 9 : 8 < 10 => Erreur => on divise
Etape 2 : entre 0 et 4 : 3 < 5 => Erreur => on divise
entre 5 et 9 : 5 5> c'est bon => on oublie entre le 5 et le 9
Etape 3 : entre 0 et 2 : 3 3> c'est bon => on oublie entre le 0 et le 2
entre 3 et 4 : 0 => toute la période du 3 au 4 est manquante
On fera (en moyenne) log(n) itérations.
Beaucoup plus compliqué à mettre en place.


Je tiens également à rappeler qu'une simple boucle peut être plus performante qu'une seule requête complexe.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
21
Date d'inscription
mercredi 7 décembre 2005
Statut
Membre
Dernière intervention
20 avril 2010

Merci krimog