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
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
Bonjour,
Au premier essai, je pense à ça (Oracle) :
Mais je pense que peux mieux faire, surtout que tu peux pas générer une aussi grande suite que tu veux.
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
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...
S'agissant d'un forum SQL et non pas ORACLE, merci de poster des requêtes SQL compatibles !
Cette requête suffit largement :
Résultat :
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
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 :
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
http://sqlpro.developpez.com/cours/gestiontemps/
A +
Salut !
Scorpio, c'est toujours un plaisir !
Tu peux faire plus drôle et moins long :
Chuis fan de CONNECT BY !
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')
Euh... attends... pas d'ORACLE ICI !!!!
(Vous auriez pas un smiley de Pacman qui se fouette lui-même ?)
![]()
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
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 ?
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 !
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![]()
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![]()
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) :
Je m'arrête là, j'ai soif.
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))
(Ouah, j'ai encore perdu 1/4 heure de ma vie pour des conneries...)
Pitié stop, je m'incline j'ai tort![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager