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 :

Génération d'une série de Date


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Génération d'une série de Date
    Bonjour,

    Je voudrai avoir une requête qui me génère une série de date.
    Exemple je veux avoir les dates entre 01/01/2009 et le 05/01/2009
    le résultat :

    Date
    ---------
    01/01/2009
    02/01/2009
    03/01/2009
    04/01/2009
    05/01/2009

    Merci

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Bonjour,

    Au premier essai, je pense à ça (Oracle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    with myT as
    (
     select 1 as col from dual
     union all
     select 1 from dual
    ),
    myT2 as
    (
    select t1.col
    from myT t1 full outer join myT t2 on 1=1
    )
    select to_date('01/01/2009','DD/MM/YYYY') + rownum - 1 as my_date
    from myT2 t1 full outer join myT2 t2 on 1=1
    where rownum <= (to_date('05/01/2009','DD/MM/YYYY') - to_date('01/01/2009','DD/MM/YYYY')) + 1
    Mais je pense que peux mieux faire, surtout que tu peux pas générer une aussi grande suite que tu veux.
    L'idée serait d'avoir une table qui aurait autant d'élément que la série de date désirée, mais la je sèche...

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    S'agissant d'un forum SQL et non pas ORACLE, merci de poster des requêtes SQL compatibles !

    Cette requête suffit largement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH
    T AS 
    (SELECT CAST('20090101' AS DATE) AS D
     UNION ALL
     SELECT D + 1 DAY AS D
     FROM   T
     WHERE  D < '20090105')
    SELECT *
    FROM   T
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D
    ----------
    2009-01-01
    2009-01-02
    2009-01-03
    2009-01-04
    2009-01-05
    Néanmoins, ce n'est pas performant. Mieux vaut avoir une table des dates dans votre base telle que je l'ai indiqué dans cet article :
    http://sqlpro.developpez.com/cours/gestiontemps/

    A +

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Scorpio, c'est toujours un plaisir !
    Tu peux faire plus drôle et moins long :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT to_date('20090101', 'yyyymmdd') + level day
    FROM Dual
    CONNECT BY to_date('20090101', 'yyyymmdd') + level <= to_date('20090105', 'yyyymmdd')
    Chuis fan de CONNECT BY !

    Euh... attends... pas d'ORACLE ICI !!!!

    (Vous auriez pas un smiley de Pacman qui se fouette lui-même ?)

  5. #5
    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 386
    Points
    18 386
    Par défaut
    Toujours sur la solution propriétaire Oracle / DB2 / PostGres.

    Pas besoin d'autant de dates dans le connect by, vous augmentez le paramétrage nécessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT to_date('20090101', 'yyyymmdd') + level -1 day -- Param date de départ
    FROM Dual
    CONNECT BY level <= 5 -- Param durée

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Certes Waldar, mais tu dois calculer ton nombre de jours avant appel de la requête...

    Est-ce vraiment plus ergonomique que de passer les deux bornes ?

  7. #7
    Scorpi0
    Invité(e)
    Par défaut
    Quel bel avatar pacmann

    Sinon je connaissais pas connect by, c'est exactement ce qu'il manquait \o/
    Et je suis d'avis avec pacmann, mieux vaut laisser à Oracle le soin de calculer le nombre de jours !

  8. #8
    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 386
    Points
    18 386
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Est-ce vraiment plus ergonomique que de passer les deux bornes ?
    Celà revient au même je suis bien d'accord, mais vous saisissez trois paramètres contre deux pour moi.
    Vous avez donc 50% de chance de plus de commettre une erreur

  9. #9
    Scorpi0
    Invité(e)
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Celà revient au même je suis bien d'accord, mais vous saisissez trois paramètres contre deux pour moi.
    Vous avez donc 50% de chance de plus de commettre une erreur
    HAHA
    Déjà 3 contre 2 ça fait que 33% de chances de se planter, et en plus tu passes aussi que 2 paramètres, il y a juste un paramètre que tu utilises 2 fois !!


  10. #10
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Mon dieu Waldar, dois-je aussi vous vouvoyer ?
    Bon, ok...

    En fait, quand je dis "ergonomie", c'est quand même important.
    A vrai dire, il s'agit même plus d'un problème de nature de l'information que d'ergonomie.
    Selon le cas, les besoins exprimés sont très différents :
    - Génèrer les X dates qui suivent une date données
    - Générer toutes les dates entre deux dates (la question posée ici).

    Si on est en "interactif", j'ai pas super envie de me taper le calcul pour savoir combien de jours représente mon interval (sauf si c'est visiblement 5... par contre, si ça avoisine 271, c'est plus lourd).
    Si pour obtenir le nombre de jours, je dois faire une autre requête (avec des fonctions de date), ça me fait de belles jambes...
    Enfin, si mon batch unix reçoit deux paramètres représentant les bornes (hypothèse qui n'est pas totalement farfelue), je trouve ça un peu dommage de calculer en shell le nombre de jours correspondant... (euh d'ailleurs, faudrait d'abord que je cherche sur google comment faire, tiens).

    @Scorpio : merci ! C'est peut être moins "IN" que Killua par contre

  11. #11
    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 386
    Points
    18 386
    Par défaut
    Oui vous avez raison sur la saisie de paramètres, c'était bien l'énoncé, et effectivement un paramètre est répété deux fois (enfin là je n'étais plus vraiment dans le très sérieux) !


    Par contre Scorpio je ne crois pas me tromper en affirmant que :
    - passer de trois paramètres à deux réduit le risque de 33% (3 * (1-1/3) = 2).
    - passer de deux paramètres à trois augmente le risque de 50% (2 * (1+1/2) = 3).

    Ma phrase concernant l'augmentation du risque que représente le passage de deux à trois et était donc correcte

  12. #12
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Allez, je voulais pousser la réflexion avant de raconter des conneries, mais finalement je vais juste balancer la suggestion :

    Idée :
    Soit k€R, 0<k <1 : la probabilité de se planter au moins une fois en saisissant un paramètre.

    Quel est la probabilité de se planter au moins une fois en saissant deux paramètres ?
    C'est
    (1 - P(ne pas se planter du tout sur deux paramètres))
    = (1 - (1-k) (1-k))
    On va dire que jusque là, c'est bon.
    On va généraliser :
    Pn= (1- (1-k)^n)

    Du coup, si on veut estimer l'augmentation de la probabilité de loose, on fait :
    PLOOSEn = (Pn+1 - Pn) / Pn
    Toujours bon ?

    Par contre, par rapport à notre problème inital, on part de la probabilité sur 2 paramètres... soit P2. Donc k1 est racine du trinome du second degré (en k) :
    P2 = 1 - (1-k) ^2 = -k^2 + 2 * k
    - k^2 + 2 * k - P2 = 0
    Euh... les racines de ce truc... souveniiiiirs (tiens google à la place) :
    Delta = 4 - 4 P2 = 4 (1 - P2)
    Racine positive (en supposant P2 > 0, acquis avec P1 > 0) :
    k1 = (2 + 2 root(1-P2))/2 = 1 + root(1-P2)

    En substituant, la probabilité sur laquelle vous (Scorpio et Waldar) vous disputez est ... (tadaaaam) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((1 - (1- (1 + root(1-P2))^3)) - (1 - (1- (1 + root(1-P2))^2))) / (1 - (1- (1 + root(1-P2))^2))
    Je m'arrête là, j'ai soif.

    (Ouah, j'ai encore perdu 1/4 heure de ma vie pour des conneries...)

  13. #13
    Scorpi0
    Invité(e)
    Par défaut
    Pitié stop, je m'incline j'ai tort

Discussions similaires

  1. [XL-2003] Débutant - Traitement d'une série de dates
    Par fanfan89 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/09/2010, 11h45
  2. Problème génération d'une séquence de date
    Par aïtaï_tsubasa dans le forum R
    Réponses: 3
    Dernier message: 03/06/2010, 10h39
  3. Convertir une série de dates en pas de temps
    Par you_go dans le forum Fortran
    Réponses: 7
    Dernier message: 27/07/2009, 16h14
  4. Calcul d'un écart-type sur une série de dates
    Par Emilie MARQUOIS-OGEZ dans le forum Excel
    Réponses: 6
    Dernier message: 30/10/2007, 14h56

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