IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Comparaison de date Linq [Débutant]


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut Comparaison de date Linq
    Bonjour,

    J'aurais souhaité un petit coup de main sur la comparaison de date avec Linq.
    dateCleanRC est un dateTime sous forme de 2016-01-01 00:00:00:000

    Hors je cherche a faire une comparaison sur 2016-01-01, mais peu importe ce que j'ai pu essayer je tombe sur aucun résultat.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //string dateChoose = monthCalendar1.SelectionRange.Start.ToString("dd/MM/yyyy"");
    string dateChoose = monthCalendar1.SelectionRange.Start.ToString("yyyy-MM-dd");
    query = from rc in db.RoomClean
    		join r in db.Room on rc.idRoomRC equals r.idR
    		//where rc.dateCleanRC.ToShortDateString().Contains((DateTime.ParseExact(dateChoose, "dd/MM/yyyy", CultureInfo.InvariantCulture)).ToString())
    		//where rc.dateCleanRC.ToString().Contains(dateChoose.ToString())
    		where rc.dateCleanRC.ToString().StartsWith(dateChoose.ToString())
    		select new
    		{
    			numRoom = r.idR,
    			nameRoom = r.nameR,
    			dateClean = rc.dateCleanRC
    		};

    Merci de votre aide.

  2. #2
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut

    Pour comparer deux dates uniquement en fonction de leur partie « Date », tu peux utiliser la propriété Date de ton DateTime . Je ne sais pas comment tu récupères ton entrée mais arrange toi pour avoir un DateTime :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DateTime dateChoose = ...;
    // ...
    where rc.dateCleanRC.Date.Equals(dateChoose.Date)
    Plus généralement, quand tu as des dates à disposition, effectue des comparaisons/opérations/etc. toujours en manipulant des types DateTime et pas des string, c'est une mauvaise pratique (parce qu'il faut prendre en compte le format d'affichage en string de la date, la culture, etc., alors qu'avec un vrai DateTime tu fais abstraction de tout ça).

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut
    Ok d'ac nickel Merci
    j'ai donc modifier la syntaxe pour est good
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where rc.dateCleanRC.Date.Equals((DateTime.ParseExact(dateChoose, "yyyy-MM-dd", CultureInfo.InvariantCulture)).Date)

    J'aurais donc une autre question, pourquoi la requête ci-dessous me retourne la date sous le format pour les champs dateStartB et dateEndB : janv 2 2016 12:00AM et comment puis je la convertir dans un autre format ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
                    query = from r in db.Room
                            join f in db.Floor on r.idFloorR equals f.idF
                            where r.idFloorR.ToString().Contains(idEtage.ToString())
                            join b in db.Booking on r.idR equals b.idRoomB into lj
                            from l in lj.DefaultIfEmpty()
                            select new
                            {
                                numRoom = r.idR,
                                nameRoom = r.nameR,
                                nameFloor = f.nameF,
                                isClean = r.isCleanR,
                                isBooking = r.isBookingR,
                                dateLastClean = r.dateLastClean,
                                dateStartBooking = l == null ? "---" : l.dateStartB.ToString(),
                                dateEndBooking = l == null ? "---" : l.dateEndB.ToString()
                            };
    Merci

  4. #4
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.
    Citation Envoyé par mGraph Voir le message
    J'aurais donc une autre question, pourquoi la requête ci-dessous me retourne la date sous le format pour les champs dateStartB et dateEndB : janv 2 2016 12:00AM et comment puis je la convertir dans un autre format ?
    Quand tu fais un ToString() sans arguments sur un DateTime, par défaut c'est le format général « G » qui est utilisé avec la culture actuelle.

    Tu peux trouver tous les différents formats d'affichage natifs à passer en argument d'un ToString ici. Pour les formats personnalisés, c'est par là. Et ensuite :


    Tu as toutes les billes

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut
    Je n'ai pour le moment que survolé les exemples je me pencherais d'avantage dessus ce soir,
    mais sur de rapides essais je tombe sur des exceptions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                                dateStartBooking = l == null ? "---" : l.dateStartB.ToString("d", CultureInfo.InvariantCulture),
                                dateEndBooking = l == null ? "---" : l.dateEndB.ToString("d", CultureInfo.InvariantCulture)
    ou même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                                dateStartBooking = l == null ? "---" : l.dateStartB.ToString("dd/MM/yyyy"),
                                dateEndBooking = l == null ? "---" : l.dateEndB.ToString("dd/MM/yyyy")

    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.Data.Linq.dll


    Mais sinon pour être plus clair sur ma démarche, la query sert à remplir un datagrid. et en fonction des dates relevé dans les colones dateStartBooking et dateEndBooking je dois modifier l'affichage d'une troisième colone.

  6. #6
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut
    Citation Envoyé par mGraph Voir le message
    Une exception non gérée du type 'System.InvalidOperationException' s'est produite dans System.Data.Linq.dll
    C'est un problème dans ta requête, regarde au débogueur (par exemple l'InnerException de l'exception catchée).

    Parce qu'il n'y a pas de souci avec le formatage des dates. Exemple bidon :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class Dummy {
        public Dummy(string name, DateTime date) {
            this.Name = name;
            this.Date = date;
        }
        public string Name { get; set; }
        public DateTime Date { get; set; }
    }
     
    // ...
     
    IList<Dummy> dummies = new List<Dummy>() {
        new Dummy("a", DateTime.Now.AddDays(-1)),
        null,
        new Dummy("b", DateTime.Now),
        null,
        new Dummy("c", DateTime.Now.AddDays(1))
    };
    var stringDummyDates = from dummy in dummies
                           select new {
                               stringDate = dummy == null ? "---" : dummy.Date.ToString("U", CultureInfo.InvariantCulture)
                           };
    var anotherStringDummyDates = from dummy in dummies
                                  select new {
                                      stringDate = dummy == null ? "---" : dummy.Date.ToString("dd/MM/yyyy")
                                  };
    Console.WriteLine("++++++++++++++++++++++++++++++");
    foreach (var item in stringDummyDates) {
        Console.WriteLine(item.stringDate);
    }
    Console.WriteLine("++++++++++++++++++++++++++++++");
    foreach (var item in anotherStringDummyDates) {
        Console.WriteLine(item.stringDate);
    }

    L'output obtenu :
    ++++++++++++++++++++++++++++++
    Tuesday, 01 March 2016 13:23:56
    ---
    Wednesday, 02 March 2016 13:23:56
    ---
    Thursday, 03 March 2016 13:23:56
    ++++++++++++++++++++++++++++++
    01/03/2016
    ---
    02/03/2016
    ---
    03/03/2016

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 51
    Par défaut
    Petite piste quelle le type de dateStartBooking ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut
    @Max, nickel c'est ok ^^
    @Buzzak, DateTime.

    Alors j'ai encore un bug je ne sais pas si cela viens de mon format de date ou de ma conversion T-SQL > Linq
    J'ai testé plusieurs format de date mais toujours le même résultat

    Le retour de ma requête SQL est OK, mais pas le retour de Linq qui a une sortie de trop 3 'Chambre 1-3'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DECLARE @p0 DateTime = getDate()
     
    SELECT [t0].[idR] AS [IdR], [t0].[nameR] AS [NameR]
    FROM [Room] AS [t0]
    LEFT JOIN [Booking] AS [t1] ON [t0].[idR] = [t1].[idRoomB]
    WHERE ((@p0 < [t1].[dateStartB]) OR (@p0 > [t1].[dateEndB])) OR ([t1].[idB] is null)
    ORDER BY [t0].[idFloorR], [t0].[nameR]
    20 'Chambre 1-20'
    21 'Chambre 1-21'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from t0 in db.Room
    join t1 in db.Booking on t0.idR equals t1.idRoomB into t1_join
    from t1 in t1_join.DefaultIfEmpty()
    where
    t1.idB == null ||
      (Convert.ToDateTime(DateTime.Now) < t1.dateStartB ||
      Convert.ToDateTime(DateTime.Now) > t1.dateEndB)
    orderby
      t0.idFloorR,
      t0.nameR
    select new {
      idR = (int)t0.idR,
      nameR = t0.nameR
    }
    20 'Chambre 1-20'
    21 'Chambre 1-21'
    3 'Chambre 1-3'

  9. #9
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Yop

    Tu pourrais donner un exemple des données en entrée et des résultats attendus ? Plus facile pour appréhender ton souci .

    Au passage, Convert.ToDateTime(DateTime.Now) est complètement superflu, c'est DateTimeCeption (même la doc le dit).

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 51
    Par défaut
    Il manque beaucoup de détail pour pouvoir t'aider..

    Il y a une condition dans la requête linq qui retourne:

    3 'Chambre 1-3' alors que cette donnée ne devrait pas être retourné?


    t1.idB == null || <-- je crois que ça pourrait être ça, mais également il pourrait manqué une condition... il faudrait plus d'info pour t'aider.

  11. #11
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2014
    Messages : 75
    Par défaut
    Je souhaite en fonction de la date lister les éléments n'ayant pas de jointure sur une date donnée. Ma req Sql est donc OK mais la conversion en Linq outchh

    Structure des Tables :
    Room
    idR : int (PK)
    nameR : varchar(50)

    Booking
    idB : int (PK)
    idRoomB : int (FK - Room.idR)
    dateStartB : DateTime
    dateEndB : DateTime

    Entrée :
    Une seul entrée prévue, une date, qui remplacera le DateTime.Now dans la clause Where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Convert.ToDateTime(DateTime.Now) < t1.dateStartB ||  Convert.ToDateTime(DateTime.Now) > t1.dateEndB)
    Sortie Obtenue :
    20 'Chambre 1-20'
    21 'Chambre 1-21'
    3 'Chambre 1-3'

    Sortie Souhaité :
    20 'Chambre 1-20'
    21 'Chambre 1-21'
    Quels autres éléments vous faut-il ?

  12. #12
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    Tu devrais afficher en sortie les éléments de ta clause where (DateStart, DateEnd etc.). Ca te permettrait sûrement de voir pourquoi une donnée non attendue ressort.

  13. #13
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par mGraph Voir le message
    Quels autres éléments vous faut-il ?
    Quand je parlais des entrées je parlais d'un jeu de données de tes tables Room et Booking (restreint au strict minimum pour coller à ton souci évidemment) pour qu'on puisse éventuellement tenter de reproduire (et corriger) ton erreur

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 51
    Par défaut
    t1.idB == null ||
    (Convert.ToDateTime(DateTime.Now) < t1.dateStartB || <------ &&
    Convert.ToDateTime(DateTime.Now) > t1.dateEndB)


    Rajoute les dates et le idreferencé dans le select new et regarde bien la ligne de 3 'Chambre 1-3' c'est sur qu'elle respect une de tes 3 conditions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Linq to Sql] Comparaison de dates
    Par Lennox dans le forum Accès aux données
    Réponses: 10
    Dernier message: 05/09/2008, 22h15
  2. comparaison de dates
    Par pmithrandir dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/06/2005, 16h12
  3. comparaison de date
    Par nickoshiba dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/03/2005, 15h48
  4. Comparaison de dates
    Par Tapioca dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2004, 15h55
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo