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

Bases de données Delphi Discussion :

where avec champ TIMESTAMP


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut where avec champ TIMESTAMP
    Bonjour,

    soit la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT CHAMP1, CHAMP2, CHAMP3 FROM MaTable
    WHERE CHAMP2 = ...
    avec CHAMP2 de type TIMESTAMP,

    j'ai 2 questions :

    1) je voudrais savoir comment écrire ma condition WHERE, par exemple si je mettais comme date 01/02/2003 23:59:59 ?

    2) est-il possible d'obtenir la date la plus ancienne en écrivant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CHAMP1, MIN(CHAMP2), CHAMP3 FROM MaTable
    NB : je travaille avec SQL Server.

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 490
    Points : 2 752
    Points
    2 752
    Billets dans le blog
    10
    Par défaut
    La conversion entre un timeStamp et un smallDateTime étant implicite je pense qu'il n'y a pas de problème.

    Penses éventuellement à exécuter la commande SQL pour définir le format de date traité par la requête


  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    je n'est pas complètement saisi ta réponse...

    tu t'es pas trompé de topic ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 846
    Points
    24 846
    Par défaut
    Pour éviter les problèmes de conversion, l'utilisation des Paramètres (Parameters et ParamByName) sont bien utile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CHAMP1, CHAMP2, CHAMP3 FROM MaTable
    WHERE CHAMP2 = :ParamChamp2
    Si ADO pour SQL Server, ... la propriété Parameters n'est pas présente dans tous les composant Query, on peut utiliser sur certains directement ParamByName

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ADOQuery.SQL.Text := '...';
    ADOQuery.Parameters.ParamByName('ParamChamp2').AsDateTime := Now();
    ADOQuery.Open();
    Enfin, il est toujours bon de connaitre les fonctions de conversion, regarde si tu as des fontions DATE_FORMAT, DATE_TO_STR, ... je ne connais pas SQL Server ...

    Pour le Min, en MySQL et Oracle sur un TimeStamp, cela fonctionne, on peut penser que sur SQL Server, aussi ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    j'ai oublié de préciser que j'utilise InterBase et non ADO.

    Le MIN ne fonctionne que s'il est seul dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT MIN(CHAMP2) FROM MaTable
    fonctionne

    mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CHAMP1, MIN(CHAMP2), CHAMP3 FROM MaTable
    fonctionne pas.

    J'ai essayé aussi ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT L1.CHAMP1, L1.CHAMP2, L1.CHAMP3 FROM MaTable L1, MaTable L2 
    WHERE L1.CHAMP2 = (SELECT MIN(CHAMP2) FROM MaTable L2 
    WHERE L1.CHAMP1= L2.CHAMP1 AND L1.CHAMP2 = L2.CHAMP2 AND L1.CHAMP3 = L2.CHAMP3) ;
    mais bizarrement ça ne marche pas non plus

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 846
    Points
    24 846
    Par défaut

    Citation Envoyé par sam-sam
    NB : je travaille avec SQL Server.

    Citation Envoyé par sam-sam
    j'ai oublié de préciser que j'utilise InterBase et non ADO.

    Tu es sur ?
    InterBase c'est un SGBD, comme SQL Server, on peut pas travailler avec l'un sur l'autre ... tu confonds ! On est mal barré !
    si tu n'utilise pas ADO est-ce donc BDE, DBExpress, CoreDac, ... ?

    Le Min ne peut fonctionner qu'avec un Group By ! c'est une fonction d'aggrégat ! faudrait peut-être se renseigner avant de poser des questions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CHAMP1, MIN(CHAMP2), CHAMP3 FROM MaTable GROUP BY CHAMP1, CHAMP3
    Attention cela donnera le plus petit CHAMP2 pour chaque couple de CHAMP1 et CHAMP3 ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Effectivement, il faudrait d'abord qu'on sache de quoi on parle !

    Parce que un TIMESTAMP dans SQL Server, ce n'est pas une date du tout. Ca n'a rien à voir avec le type timestamp du standard ISO.

    Il s'agit de l'ancienne syntaxe pour rowversion.

    Voici le lien vers la doc du timestamp/rowversion de SQL Server.
    http://msdn.microsoft.com/en-us/library/ms182776.aspx

    Donc si tu es avec SQL Server :
    1) je voudrais savoir comment écrire ma condition WHERE, par exemple si je mettais comme date 01/02/2003 23:59:59 ?
    C'est simple, ce n'est pas possible.

    2) est-il possible d'obtenir la date la plus ancienne en écrivant ceci :
    Si je me souviens bien, la seule opération possible sur un timestamp c'est de tester sa valeur dans une clause WHERE (et d'obtenir une erreur en cas de non égalité...).

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    oui je suis sûr (j'utilise InterBase)

    par contre, petit rectificatif : je bosse sur le logiciel "EMS SQL Manager 2005 for InterBase & Firebird Lite"

    comment faire alors pour avoir le min de ce champ ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    1) je voudrais savoir comment écrire ma condition WHERE, par exemple si je mettais comme date 01/02/2003 23:59:59 ? et uniquement à cette heure là
    Pour InterBase/FireBird grâce au CAST

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CHAMP1, CHAMP2, CHAMP3 FROM MaTable
    WHERE CHAMP2 = CAST('01.02.2003 23:59:59' AS DATE)
    pour un jour seulement cela dépendra entre autre de la version de IB/FB

    Ceci dit ATTENTION au formatage de la date ici sous sa forme jj.mm.aaaa

    01/02/2003 forme mm/jj/aaaa
    2003-02-01 forme aaaa-mm-jj

    Quant au GROUP BY SaiLeTroll l'a si bien expliqué
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    j'ai essayé le CAST,

    j'obtiens l'erreur suivante : conversion error from string ...

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    le CAST indiqué était pour les versions de Firebird/InterBase , ne connaissant pas SQL Serveur . Suite ce dernier Post je suis allé sur le Site de MS SQL Serveur et là que vois-je :

    il existe des champs Date , DateTime respectant la norme ISO donc j'en déduit que ceci devrait fonctionner si champ2 est d'un de ces types


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CHAMP1, CHAMP2, CHAMP3 FROM MaTable
    WHERE CHAMP2 = CAST('2003-02-01' AS DATE)
     
    SELECT CHAMP1, CHAMP2, CHAMP3 FROM MaTable
    WHERE CHAMP2 = CAST('2003-02-01 23:59:59' AS DATETIME)
    par contre comme le dit si bien Franck
    Parce que un TIMESTAMP dans SQL Server, ce n'est pas une date du tout.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    finalement j'ai réussi à sélectionner le TIMESTAMP le plus ancien avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CHAMP1, CHAMP2, CHAMP3 FROM MaTable 
    WHERE CHAMP2 = 
    (
      SELECT MIN(CHAMP2) FROM (SELECT CHAMP2 FROM MaTable)
    )


    par contre, je voudrais faire la même chose avec la date de ce TIMESTAMP car avec ce code, j'ai la date ET le temps le plus ancien, or j'ai plusieurs temps pour un même jour...

  13. #13
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 114
    Points : 39
    Points
    39
    Par défaut
    c'est bon, j'ai sélectionné que la date grâce à la fonction FormatDateTime("yyyy/mm/dd", maDate).


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

Discussions similaires

  1. [AC-97] clause Where avec 2 champs
    Par docjo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/08/2010, 18h37
  2. Réponses: 5
    Dernier message: 28/08/2009, 18h42
  3. WHERE avec champ renseigné par l'utilisateur
    Par yuyuch dans le forum iReport
    Réponses: 1
    Dernier message: 20/03/2008, 12h11
  4. soucis avec champ timestamp
    Par bstages2000 dans le forum Oracle
    Réponses: 5
    Dernier message: 10/12/2007, 18h44
  5. where avec un champ timestamp
    Par DBBB dans le forum SQL
    Réponses: 3
    Dernier message: 26/05/2004, 11h20

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