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

Langage SQL Discussion :

Grouper sur la date (Timestamp ↔ Date)


Sujet :

Langage SQL

  1. #1
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut Grouper sur la date (Timestamp ↔ Date)
    Forum,

    Je cherche mais pour le moment, je ne trouve pas.
    Mon problème est le suivant : mon but est d'obtenir une liste des dossiers dans lesquels une tâche (OFFICIAL_DECISION, SYSTEM, SUP_AGR) a été traitée (HANDLED). Jusque là, OK. Il faudrait que cette liste de dossier soit liée au fait qu'un trigger (Bas revenus) a été généré entre la date de traitement de la tâche (ci-avant) et cette date + 7 jours.

    Voilà mon query :

    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
    select f.file_number
        , to_char(t.handling_date, 'yyyymmdd') as DATE_Tk
        , flt.change_date as date_TRG
    from files f
    inner join tasks t on t.file_number = f.file_number
        and t.classification = 'OFFICIAL_DECISION'
        and t.type='SYSTEM'
        and t.description_french like '%SUP_AGR%'
        and t.status = 'HANDLED'
    INNER JOIN beneficiaries ben ON ben.file_number = f.file_number
    LEFT JOIN lumpsum_beneficiaries forf ON ben.actor_id = forf.actor_id
     
    inner join file_logging_triggers flt on flt.file_number = f.file_number
        and flt.description_french like '%-> Bas revenus%'
        and to_char(flt.change_date, 'yyyymmdd') between to_char(t.handling_date,'yyyymmdd') and to_char(t.handling_date + 7 , 'yyyymmdd')
    ;
    Un des problèmes est qu'au niveau des tâches, je suis avec une DATE alors qu'au niveau des triggers, j'ai un TIMESTAMP.
    Du coup, j'ai une redondance car dans un dossier au moins, j'ai deux triggers à quelques secondes d'écart. Voir cette image :
    Nom : sql.png
Affichages : 414
Taille : 83,9 Ko

    Comment puis-je faire pour que :
    • Si j'ai deux triggers le même jour, je ne garde que le premier (pour autant que je sois dans la période)
    • Si j'ai deux triggers sur deux jours différents (et toujours dans la priode), je ne garde que le premier


    Je pense que c'est clair... pour moi. Si ce l'est moins pour vous, n'hésitez pas à poser les questions.
    Merci,

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Vous pouvez utiliser la fonction analytique ROW_NUMBER pour numéroter les lignes par période selon la date.
    Il ne reste en suite qu'a filtrer les lignes >1

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Pourquoi, dans le prédicat de jointure de la table "file_logging_triggers", convertir les dates en char avant de vérifier l'inclusion dans une période

  4. #4
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Hello !
    Citation Envoyé par escartefigue
    Pourquoi, dans le prédicat de jointure de la table "file_logging_triggers", convertir les dates en char avant de vérifier l'inclusion dans une période
    J'avoue que je n'ai pas de grandes connaissances en sql et donc, je tâtonne. Cela pose un problème ? Et lequel ? Merci,
    Je devrais faire comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    inner join (
        select fil.file_number
            ,flt.change_date as DATE_TR
        from files fil
        inner join file_logging_triggers flt on flt.file_number = fil.file_number
            and flt.description_french like '%-> Bas revenus%'
        ) Trig
    on trig.file_number = f.file_number
    where to_char(trig.date_tr, 'yyyymmdd') between to_char(t.handling_date,'yyyymmdd') and to_char(t.handling_date + 7 , 'yyyymmdd')

  5. #5
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut
    Hello

    Citation Envoyé par aieeeuuuuu
    Vous pouvez utiliser la fonction analytique ROW_NUMBER pour numéroter les lignes par période selon la date.
    Il ne reste en suite qu'a filtrer les lignes >1
    Je regarde cette fonction et son fonctionnement. Mais déjà je me demande comment filtrer les lignes > 1 en fonction de la date ?

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par QuestVba Voir le message
    J'avoue que je n'ai pas de grandes connaissances en sql et donc, je tâtonne. Cela pose un problème ? Et lequel ? Merci,
    Ça peut dégrader les performances : si un index était éligible, l'utilisation d'une fonction sur la colonne rend cet index inutilisable.

    Si votre SGBD est SQL server, alors le timestamp n'est pas une date et vous êtes donc contraint à effectuer la conversion en char
    Avec d'autres SGBD, cette conversion n'est pas utile, vous pouvez convertir le timestamp en date et comparer avec les colonnes date

    Exemple de syntaxe avec DB2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select col1, col2, ..., coln 
    from ma_table
    where date(col_timestamp) between col_datedeb and col_datefin
    Exemple avec postgre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select col1, col2, ..., coln 
    from ma_table
    where date_trunc('day', col_timestamp) between col_datedeb and coldatefin

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Si votre SGBD est SQL server
    Ça sent l'Oracle Database a plein nez :
    • fonctions to_char
    • pas de as sur les alias de table
    • client Oracle SQL Developer


    Le commentaire est toutefois valide sachant qu'Oracle sait parfaitement comparer des timestamps à des dates.
    @QuestVba changez cette ligne de code par la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- "Pas bien"
    where to_char(trig.date_tr, 'yyyymmdd') between to_char(t.handling_date,'yyyymmdd') and to_char(t.handling_date + 7 , 'yyyymmdd')
     
    -- "Bien"
    where trig.date_tr between trunc(t.handling_date) and trunc(t.handling_date) + 7

Discussions similaires

  1. [MySQL] question sur les dates (timestamp)
    Par nintendoplayer dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 03/12/2007, 10h52
  2. Filtre sur la date d'un timestamp
    Par ottocom dans le forum Hibernate
    Réponses: 1
    Dernier message: 27/05/2007, 17h24
  3. Grouper sur mois et année (seulement) d'une date
    Par Claythest dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/03/2007, 12h28
  4. [Derby] Requete date courante sur un champ Timestamp
    Par spekal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/09/2006, 10h54
  5. Réponses: 1
    Dernier message: 18/08/2006, 16h20

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