Vous n'êtes pas identifié(e).
En fait, je m'auto répond
Le "updatetime BETWEEN '2012-08-20 00:00:00' AND '2012-08-25 00:00:00'" de la 1ere requete n'est pas du tout pris en compte ^^
Bonjour,
Par erreur j'ai écris la requete suivante :
Qui me sortie 124 enregistrements.
Puis j'ai vu que mon GROUP BY n'était pas à la fin, j'ai donc corrigé en :
Et la surprise, j'ai plus que 94 enregistrements.
Donc, j'en conclu que ce n'est pas la meme requete ^^
Le GROUP BY est pas sensé etre tjs a la fin?
Et du coup quelle est la différence entre mes 2 requetes?
Merci
Salut,
Tu dis :
pour avoir le nombre d'heures totales entre deux dates, il suffit de faire un
(UNIX_TIMESTAMP(end_date)-UNIX_TIMESTAMP(start_date))/3600
Oui ca donne le nombre d'heure entre 2 dates, mais la en dehors des ouverts ouvrés "le temps s'arrête"
Par exemple, pour les heures ouvré de 8h a 19h, si j'ai un dossier qui a été ouvert à 18h et fermé le lendemain a 9h, ce dossier aura été ouvert pendant 2h.
Enfin je note que je dois faire une table hollidays pour stocker les jours fériés
merci
bonjour,
A defaut de réussir a adapter quelque chose que je ne maitrissais pas, j'ai pondu la fonction suivante en php. IL ne me reste plus qu'a en faire une procédure stockée.
if ($date_start != $date_stop){
$nb_second_first_et_last_jour = (strtotime($date_close_start) - strtotime($date_start_full)) + (strtotime($date_stop_full) - strtotime($date_open_start));
}else{
$nb_second_first_et_last_jour = (strtotime($date_stop_full) - strtotime($date_start_full));
}
$arr_bank_holidays = array(); // Tableau des jours feriés
// On boucle dans le cas où l'année de départ serait différente de l'année d'arrivée
$diff_year = date('Y', $date_stop) - date('Y', $date_start);
for ($i = 0; $i <= $diff_year; $i++) {
$year = (int)date('Y', $date_start) + $i;
// Liste des jours feriés
$arr_bank_holidays[] = '1_1_'.$year; // Jour de l'an
$arr_bank_holidays[] = '1_5_'.$year; // Fete du travail
$arr_bank_holidays[] = '8_5_'.$year; // Victoire 1945
$arr_bank_holidays[] = '14_7_'.$year; // Fete nationale
$arr_bank_holidays[] = '15_8_'.$year; // Assomption
$arr_bank_holidays[] = '1_11_'.$year; // Toussaint
$arr_bank_holidays[] = '11_11_'.$year; // Armistice 1918
$arr_bank_holidays[] = '25_12_'.$year; // Noel
// Récupération de paques. Permet ensuite d'obtenir le jour de l'ascension et celui de la pentecote
$easter = easter_date($year);
$arr_bank_holidays[] = date('j_n_'.$year, $easter + 86400); // Paques
$arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*39)); // Ascension
$arr_bank_holidays[] = date('j_n_'.$year, $easter + (86400*50)); // Pentecote
}
$nb_days_open = 0;
// on rajoute +1 jour a la date_start vu que le 1er jour est deja calculé et idem pour le dernier jour
$date_start = $date_start + 86400;
$date_stop = $date_stop - 86400;
while ($date_start <= $date_stop) {
// Si le jour suivant n'est ni un dimanche (0) ou un samedi (6), ni un jour férié, on incrémente les jours ouvrés
if (!in_array(date('w', $date_start), array(0, 6))
&& !in_array(date('j_n_'.date('Y', $date_start), $date_start), $arr_bank_holidays)) {
$nb_days_open++;
}
$date_start = mktime(date('H', $date_start), date('i', $date_start), date('s', $date_start), date('m', $date_start), date('d', $date_start) + 1, date('Y', $date_start));
}
$nb_jours_ouvres = $nb_days_open ;
echo "<br> jour ouvrés : ".$nb_jours_ouvres ;
echo "<br> nb heure du 1er jour : ".$nb_heure_first_jour ;
echo "<br> nb_heure_last_jour : ".$nb_heure_last_jour ;
$nb_heures_ouvres = $nb_jours_ouvres * $opentime + ($nb_second_first_et_last_jour /3600);
return $nb_heures_ouvres;
}
$date_depart = '2012-08-14 12:00:00';
$date_fin = '2012-08-16 18:00:00';
$nb_heures_ouvres = get_nb_open_hours($date_depart, $date_fin) ;
echo '<br><br>Il y a '.$nb_heures_ouvres.' heures ouvrés entre le '.$date_depart.' et le '.$date_fin ;
?>
Bonjour,
J'ai récupérer une fonction sql qui permet de calculer le nombre d'heure entre 2 dates. Cette fonction ne fonctionne pas sur une base de 24h, mais sur une base de 11h (soit les heures ouvrées : 8h à 19h)
Je dois passer cette fonction sur mysql, mais j'ai qq soucis
Voila la fonction sql server :
RETURNS INT
AS
BEGIN
declare @begin_time datetime
declare @end_time datetime
declare @bdate datetime
declare @edate datetime
declare @nbFerie int
declare @startDate datetime
declare @endDate datetime
set @begin_time = '8:00:00'
set @end_time = '19:00:01'
set @startDate = @Start_date
set @endDate = @end_date
if DATEPART(hour, @start_date) < DATEPART(Hour, @begin_time) begin set @startDate = CAST(convert(varchar, @start_date, 111) +' '+ @begin_time as datetime) end
if DATEPART(hour, @start_date) > DATEPART(Hour, @end_time) begin set @startDate = CAST(convert(varchar, @start_date, 111) +' '+ @end_time as datetime) end
if DATEPART(hour, @end_date) < DATEPART(Hour, @begin_time) begin set @endDate = CAST(convert(varchar, @end_date, 111) +' '+ @begin_time as datetime) end
if DATEPART(hour, @end_date) > DATEPART(Hour, @end_time) begin set @endDate = CAST(convert(varchar, @end_date, 111) +' '+ @end_time as datetime) end
IF DATEPART ( WEEKDAY , @endDate + @@DATEFIRST - 1) = 6 begin set @endDate = CAST(CONVERT(varchar, DATEADD(day,-1, @endDate),111)+' '+@end_time as datetime) end
set @bdate = dateadd(day, datediff(day, 0, @startDate), 0)
set @edate = dateadd(day, datediff(day, 0, @endDate), 0)
set @nbFerie = (SELECT COUNT(*) FROM dbo.DatesFerie WHERE DateFerie BETWEEN @startDate AND @endDate)
RETURN
( SELECT ((total_days / 7) * 5 + total_days % 7 -
CASE WHEN 6 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END -
CASE WHEN 7 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END ) * 39600 - DATEDIFF(second, @bdate + @begin_time, @startDate) - DATEDIFF(second, @endDate, @edate + @end_time) - (@nbFerie * 36000)
FROM ( SELECT total_days, start_weekday,
start_weekday + total_days % 7 - 1
FROM ( SELECT DATEDIFF ( day , @startDate, @endDate) + 1,
DATEPART ( WEEKDAY , @startDate + @@DATEFIRST - 1)
) AS T(total_days, start_weekday)
) AS D(total_days, start_weekday, end_weekday)
);
END
Et voila ce que j'ai pour le moment fait en mysql :
RETURNS INT
BEGIN
declare begin_time datetime;
declare end_time datetime ;
declare bdate datetime ;
declare edate datetime ;
declare nbFerie int ;
declare startDate datetime ;
declare endDate datetime;
set begin_time = '8:00:00' ;
set end_time = '19:00:01';
set startDate = start_date ;
set endDate = end_date ;
if DATEPART(hour, start_date) < DATEPART(Hour, begin_time) then set startDate = CAST(convert(char, start_date, 111) +' '+ begin_time as datetime) end if;
if DATEPART(hour, start_date) > DATEPART(Hour, end_time) then set startDate = CAST(convert(char, start_date, 111) +' '+ end_time as datetime) end if;
if DATEPART(hour, end_date) < DATEPART(Hour, begin_time) then set endDate = CAST(convert(char, end_date, 111) +' '+ begin_time as datetime) end if;
if DATEPART(hour, end_date) > DATEPART(Hour, end_time) then set endDate = CAST(convert(char, end_date, 111) +' '+ end_time as datetime) end if;
IF DATEPART ( WEEKDAY , endDate + @@DATEFIRST - 1) = 6 then set endDate = CAST(CONVERT(char, DATEADD(day,-1, endDate),111)+' '+end_time as datetime) end if;
set bdate = dateadd(day, datediff(day, 0, startDate), 0) ;
set edate = dateadd(day, datediff(day, 0, endDate), 0) ;
RETURN
( SELECT ((total_days / 7) * 5 + total_days % 7 -
CASE WHEN 6 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END -
CASE WHEN 7 BETWEEN start_weekday AND end_weekday
THEN 1 ELSE 0 END ) * 39600 - DATEDIFF(second, bdate + begin_time, startDate) - DATEDIFF(second, endDate, edate + end_time)
FROM ( SELECT total_days, start_weekday,
start_weekday + total_days % 7 - 1
FROM ( SELECT DATEDIFF ( day , startDate, endDate) + 1,
DATEPART ( WEEKDAY , startDate + @@DATEFIRST - 1)
) AS T(total_days, start_weekday)
) AS D(total_days, start_weekday, end_weekday)
);
END
Là ca coince à la ligne 22 : #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' start_date, 111) +' '+ begin_time as datetime) end if; if DATEPART(hour, star' at line 22
Je continu de chercher, mais si vous avez des idées, suggestion, etc je suis preneur
merci
Edit 12h:
Bon, a priori convert() en sql server et mysql ne sont pas les même choses, super ^^
Enfin, je n'ai pas besoin du convert je pense, car ma date ici sera deja au bon format AAAA-MM-JJ hh:mm:ss
Edit 16h:
J'ai du mal a comprendre ce que fait la ligne suivante, avez vous une idée?
Je crois que je vais essayer de changer ma table pour que le traitement soit plus simple...
Salut,
Tu as modifié quoi a 14h? juste le LEFT JOIN qui est devenu INNER JOIN ou autre chose?
Sinon je suis dessus depuis 14h, il y avait des truc a corrigé car ta requete (tel quelle) me sortait 500 lignes (alors que j'ai en gros 50 enregistrements ^^
Bon le mieux que j'ai pour le moment c'est avec ca :
J'ai je crois juste supprimé le "nb_intervention" du GROUP BY de la reque t6
MAIS je n'ai le résultat que pour 1 seul tech sur 1 seul site...
Alors que chaque requête lancé indépendamment me donne bien pour tous les tech et tous les sites, en image :
OK, donc si j'ai bien compris, le ROLLUP me permet de faire les calcules des lignes Total de mon tableau, en faisant une requete du genre :
a priori ça fonctionne bien
J'essaye deja dans un 1er temsp d'afficher les lignes pour une meme equipe, sans total ni rien, et je bloque, je n'obtient pas ce que je voudrais... est ce que je dois bien faire qqchose du genre :
Salut,
Oui je reviens de vacances ^^ (et j'ai pas mal de boulot, j'ai meme pas le temps de travailler pour moi )
non je n'ai pas mis de clé id, mais je peux en rajouter s'il le faut.
En fait le contenu de cette table est est "résumé" d'une autre bcp plus grosse dont j'en extrait ce qui m'intéresse. La table est minuscule pour le moment, mais va gagner environ 50 enregistrements par jour.
je ne connais pas WITH ROLLUP, mais je vais y jetter un oeil
Merci
Bonjour,
Je dois créer un tableau dynamique via des informations de ma bdd, mais je ne sais pas trop comment m'y prendre pour faire sa proprement.
Je vous montre ça, ca vous permettra de bien comprendre.
le tableau finalement que je souhaiterai :
Ma base de donnée qui est de la forme :
Comment faire pour avoir un tableau comme ci-dessus, avec un code propre (pas 50 requetes sql j'entend). (Pour info, un user peut être dans plusieurs équipes)
Voici le "début" de code qui ne sert pas a grand chose ... :
}
?>
<table style="text-align:center">
<tr>
<td style="width:100px" class="cellule_red"><b>Groupe d'affectation</b></td>
<td style="width:100px" class="cellule_red"><b>Technicien</b></td>
<td style="width:100px" class="cellule_red"><b>Urgente</b></td>
<td style="width:100px" class="cellule_red"><b>Express</b></td>
<td style="width:100px" class="cellule_red"><b>Courte</b></td>
<td style="width:100px" class="cellule_red"><b>Moyenne</b></td>
<td style="width:100px" class="cellule_red"><b>Longue</b></td>
<td style="width:100px" class="cellule_red"><b>Total</b></td>
</tr>
</table>
Je ne sais pas trop si je dois traiter toutes les infos dans mon while avant mon tableau ou dans la tableau (je pense que ca doit etre fait dans la tableau sinon ca ne sera pas propre)
un gros coup de main svp?
merci
Oui oui, je suis bien concient de tout ca.
J'utilise une table memory ici, car c'est dans le même style que pour mes courses et mon cron, donc c'est pour ca que j'ai dis que j'ai fait comme tu m'avais conseillé
Je ne fais pas ca tout le temps ^^
OK je vais tester ca, merci
Bonsoir,
Petite question JC (ou pour qui pourra me dire)
Quand je fais ce qu'on a vu ensemble, cad la création d'un table memory pour tout gérer, comment je peux faire pour faire un INSERT "précis".
je met tout le code mais seul le 2eme morceau me pose soucis :
$sql7 = "INSERT INTO m_defis3 (id_defis, id_pseudo, id_gerant, id_employe_gagnant, invest_du_parieur, gain_du_parieur, gain_gerant)
SELECT p1.id_defis, p1.id_pseudo, pm.id_pseudo, d.employe_gagnant, p1.somme, calc_gain_parieur(p1.somme,p2.somme_mise_gagnant,p3.somme_mise_perdant,d.employe_gagnant,p1.id_employe),
(p3.somme_mise_perdant - (p3.somme_mise_perdant*90/100))
FROM defis_paris AS p1
LEFT JOIN defis AS d ON (p1.id_defis=d.id )
LEFT JOIN perso_masseur AS pm ON (pm.id=d.employe_gagnant )
LEFT JOIN (
SELECT id_defis, sum(somme) as somme_mise_gagnant
FROM defis_paris
INNER JOIN defis ON (defis_paris.id_employe=defis.employe_gagnant AND defis_paris.id_defis=defis.id)
GROUP BY defis_paris.id_defis
) AS p2 ON (p1.id_defis=p2.id_defis)
LEFT JOIN (
SELECT id_defis, sum(somme) as somme_mise_perdant
FROM defis_paris
INNER JOIN defis ON (defis_paris.id_employe!=defis.employe_gagnant AND defis_paris.id_defis=defis.id)
GROUP BY defis_paris.id_defis
) AS p3 ON (p1.id_defis=p3.id_defis)
WHERE d.statut=3
";
$result = mysql_query($sql7);
if ($result===false){throw new Exception("Erreur de remplissage de la table memory defis3",E_USER_NOTICE);}
if (mysql_affected_rows()>0){
// on distribue les gains au parieurs
$sqlUp = "UPDATE perso, m_defis3
SET perso.argent=(perso.argent + m_defis3.gain_du_parieur)
WHERE perso.id_pseudo=m_defis3.id_pseudo ";
$result = mysql_query($sqlUp);
if ($result===false){throw new Exception("MAJ argent gagnant du defi <br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
// on distribue les gains au gérant
$sqlUp = "UPDATE perso, m_defis3
SET perso.argent=(perso.argent + m_defis3.gain_gerant)
WHERE perso.id_pseudo=m_defis3.id_gerant ";
$result = mysql_query($sqlUp);
if ($result===false){throw new Exception("MAJ argent gérant du defi <br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
Et voila ce que j'arrive pas a faire. Peux etre qu'on ne peut tout simplement pas le faire comme ca ^^
$sqlUp = "INSERT INTO msg VALUES ('','20','Défi gagné','$msg_contenu','$jour_heure','0')
WHERE msg.id_destinataire=m_defis3.id_gerant ";
$result = mysql_query($sqlUp);
if ($result===false){throw new Exception("MAJ argent gérant du defi <br>$sqlUp<br>".mysql_error()."",E_USER_NOTICE);}
Comment faire pour que $gain_pr_gagant est la valeur que je veux (et qui biensur est présente dans ma table m_defis3 ?
Merci
Merci
il me manquait aussi un GROUP BY
Eh oui, j'essaye de réutiliser tout ce qu'on a vu ensemble, meme si des fois je m'enbrouille
Merci
Bonjour,
Je suis confronté a une erreur sql, dont je ne trouve pas le soucis.
Voici ma requete :
L'erreur donnée par phpmyadmin est : #1054 - Unknown column 'p2.id_defis' in 'on clause'
Je comprend l'erreur, mais je ne vois pas pourquoi il me sert ca... id_defis existe bien dans la table defis_paris
Pour info m_defis3 est un table memory juste créé pour faire des calcules
Les autres tables sont :
--
-- Structure de la table `defis`
--
CREATE TABLE IF NOT EXISTS `defis` (
`id` int(10) unsigned NOT NULL auto_increment,
`date_defis` datetime NOT NULL,
`statut` tinyint(3) unsigned NOT NULL,
`employe_gagnant` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `etat` (`statut`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
-- --------------------------------------------------------
--
-- Structure de la table `defis_paris`
--
CREATE TABLE IF NOT EXISTS `defis_paris` (
`id` int(10) unsigned NOT NULL auto_increment,
`id_defis` int(10) unsigned NOT NULL,
`id_employe` int(10) unsigned NOT NULL,
`id_pseudo` int(10) unsigned NOT NULL,
`somme` smallint(5) unsigned NOT NULL,
`jour` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `id_defis` (`id_defis`,`id_employe`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
-- --------------------------------------------------------
--
-- Structure de la table `defis_participant`
--
CREATE TABLE IF NOT EXISTS `defis_participant` (
`id_defis` int(10) unsigned NOT NULL,
`id_employe` int(10) unsigned NOT NULL,
`id_pseudo` int(10) unsigned NOT NULL,
`statut_employe` tinyint(3) unsigned NOT NULL,
`lanceur` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`id_defis`,`id_employe`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Enfin je pense que ma requete sql et l'erreur vous suffiront a m'aiguiller
merci d'avance
L'interet est de faire le calcule d'une distance parcouru et de l'utiliser dans une requete sql
ici :
Et merci JC, en effet ca fonctionne mieux
Voila le message d'erreur de pma :
CREATE DEFINER = `root`@`localhost` FUNCTION `calc_dist` (
strong smallint,
agilite smallint,
intel smallint,
endurance smallint,
temps smallint,
puissance_min smallint,
puissance smallint,
duree smallint,
type_circuit varchar( 1 )
) BEGIN DECLARE c_rand INT;
SET c_rand = FLOOR( -999 + RAND( ) *1998 ) /100;
IF type_circuit = S THEN SET add_competence = strong;
END IF ;
IF type_circuit = A THEN SET add_competence = agilite;
END IF ;
IF type_circuit = I THEN SET add_competence = intel;
END IF ;
IF type_circuit = E THEN SET add_competence = endurance;
END IF ;
RETURN (
(
puissance - ( (
puissance_min + add_competence
) / endurance ) * temps / ( duree *120 )
) * temps + c_rand
);
END
MySQL a répondu:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
DECLARE rand INT;
SET c_rand=FLOOR(-999+RAND()*1998)/100;
IF type_ci' at line 4
J'ai donc mis :
[code)mysql]SET c_rand=FLOOR(-999+RAND()*1998);[/code]
mais j'ai toujours :
MySQL a répondu:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEGIN
DECLARE rand INT;
SET c_rand=FLOOR(-999+RAND()*1998);
IF type_ci' at line 4
pour avoir un nombre aléatoire.
l'idée est de faire la meme chose que ca en php :
J'avais hésité a essayer sans, puis je me suis dis que non..
enfin toujours est il que non ca ne solution pas le probleme. tjs même msg d'erreur
Malgré le code modifié, ca me donne tjs la même erreur :
DECLARE rand INT;
SET rand = ROUND(-999,999);
IF type_circuit == 'S' THEN SET add_competence = strong; END IF;
IF type_circuit == 'A' THEN SET add_competence = agilite; END IF;
IF type_circuit == 'I' THEN SET add_competence = intel; END IF;
IF type_circuit == 'E' THEN SET add_competence = endurance; END IF;
RETURN ((puissance-((puissance_min+add_competence)/endurance)*temps/(duree*120))*temps+ rand);
END##
1)
MySQL a répondu:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE rand INT;
SET rand = ROUND(-999,999);
IF type_circuit == 'S' THEN S' at line 6
2) le delimiter est bien a ##
3) oui, 2 return... surement un mauvais copier/coller via le forum
Salut,
avec du retard, j'essaye donc de faire ma fonction de calcule de distance, avec les améliorations souhaitées, mais phpmyadmin me sert qu'il y a un erreur donc ca n'en veut pas. j'ai essayer de la tourner dans tous les sens et je vois pas le chmilblik... une idée?
DECLARE rand INT;
SET rand = ROUND(-999,999);
IF type_circuit == 'S' THEN SET add_competence = strong; END IF;
IF type_circuit == 'A' THEN SET add_competence = agilite; END IF;
IF type_circuit == 'I' THEN SET add_competence = intel; END IF;
IF type_circuit == 'E' THEN SET add_competence = endurance; END IF;
RETURN ((puissance-((puissance_min+add_competence)/endurance)*temps/(duree*120))*temps+ rand)
RETURN id_gagnant;
END##
Merci
Merci
La je l'utilise dans une requete :
bonne soirée
Bonsoir,
Je n'ai pas eu vraiment le temps de la faire, mais j'ai du en faire une pour un autre site, donc j'ai utiliser ce que tu m'avais dis.
IL faut vraiment que j'arrive à trouver du temps pour crazy pet
Mais je ne colle l'autre que j'ai pu faire grace a ton aide :
CREATE DEFINER=`root`@`localhost`
FUNCTION `calc_combat2`(id_employe_expediteur int, agressivite_expediteur int, id_employe_destinataire int, agressivite_destinataire int)
RETURNS INT
BEGIN
DECLARE rand1 INT;
DECLARE rand2 INT;
DECLARE id_gagnant INT;
DECLARE id_perdant INT;
SET rand1 = ROUND(RAND()*agressivite_expediteur,RAND()*agressivite_expediteur*10);
SET rand2 = ROUND(RAND()*agressivite_destinataire,RAND()*agressivite_destinataire*10);
IF rand1 >= rand2 THEN
SET id_gagnant = id_employe_expediteur;
SET id_perdant = id_employe_destinataire;
END IF;
IF rand1 < rand2 THEN
SET id_gagnant = id_employe_destinataire;
SET id_perdant = id_employe_expediteur;
END IF;
INSERT INTO defis_perdu VALUES (id_perdant,'honte',DATE_ADD(NOW(),INTERVAL 1 DAY))
RETURN id_gagnant;
END##
Je te tiens au courant
merci