/** * Calcule les cas particuliers de critères de date * * Lorsque la colonne correspond à un critère de date, tel que * jour, jour_relatif, jour_x, age, age_relatif, age_x... * * @param string $idb Identifiant de la boucle * @param array $boucles AST du squelette * @param string $col Nom du champ demandé * @return string|array * chaine vide si ne correspond pas à une date, * sinon liste * - expression SQL de calcul de la date, * - nom de la colonne de date (si le calcul n'est pas relatif) **/ function calculer_critere_infixe_date($idb, &$boucles, $col) { if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?\$,", $col, $regs)) { return ''; } $boucle = $boucles[$idb]; $table = $boucle->show; // si c'est une colonne de la table, ne rien faire if (isset($table['field'][$col])) { return ''; } if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) { return ''; } $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date']; $pred = $date_orig = $table['date']; $col = $regs[1]; if (isset($regs[3]) and $suite = $regs[3]) { # Recherche de l'existence du champ date_xxxx, # si oui choisir ce champ, sinon choisir xxxx if (isset($table['field']["date{$suite}"])) { $date_orig = 'date' . $suite; } else { $date_orig = substr($suite, 1); } $pred = $date_orig; } else { if (isset($regs[2]) and $rel = $regs[2]) { $pred = 'date'; } } $date_compare = "\"' . normaliser_date(" . calculer_argument_precedent($idb, $pred, $boucles) . ") . '\""; $col_vraie = $date_orig; $date_orig = $boucle->id_table . '.' . $date_orig; switch ($col) { case 'date': $col = $date_orig; break; case 'jour': $col = "DAYOFMONTH({$date_orig})"; break; case 'mois': $col = "MONTH({$date_orig})"; break; case 'annee': $col = "YEAR({$date_orig})"; break; case 'heure': $col = "DATE_FORMAT({$date_orig}, \\'%H:%i\\')"; break; case 'age': $col = calculer_param_date("NOW()", $date_orig); $col_vraie = ""; // comparer a un int (par defaut) break; case 'age_relatif': $col = calculer_param_date($date_compare, $date_orig); $col_vraie = ""; // comparer a un int (par defaut) break; case 'jour_relatif': $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))"; $col_vraie = ""; // comparer a un int (par defaut) break; case 'mois_relatif': $col = "MONTH(" . $date_compare . ")-MONTH(" . $date_orig . ")+12*(YEAR(" . $date_compare . ")-YEAR(" . $date_orig . "))"; $col_vraie = ""; // comparer a un int (par defaut) break; case 'annee_relatif': $col = "YEAR(" . $date_compare . ")-YEAR(" . $date_orig . ")"; $col_vraie = ""; // comparer a un int (par defaut) break; } return array($col, $col_vraie); }
function calculer_critere_infixe_date($idb, &$boucles, $regs) { global $table_date; $boucle = $boucles[$idb]; $col = $regs[1]; $date_orig = $pred = isset($table_date[$boucle->type_requete])?$table_date[$boucle->type_requete]:'date'; if (isset($regs[3]) AND $suite=$regs[3]) { # Recherche de l'existence du champ date_xxxx, # si oui choisir ce champ, sinon choisir xxxx $t = $boucle->show; if ($t['field']["date$suite"]) $date_orig = 'date'.$suite; else $date_orig = substr($suite, 1); $pred = $date_orig; } else if (isset($regs[2]) AND $rel=$regs[2]) $pred = 'date'; $date_compare = "\"' . normaliser_date(" . calculer_argument_precedent($idb, $pred, $boucles) . ") . '\""; $date_orig = $boucle->id_table . '.' . $date_orig; switch ($col) { case 'date': $col = $date_orig; break; case 'jour': $col = "DAYOFMONTH($date_orig)"; break; case 'mois': $col = "MONTH($date_orig)"; break; case 'annee': $col = "YEAR($date_orig)"; break; case 'heure': $col = "DATE_FORMAT($date_orig, '%H:%i')"; break; case 'age': $col = calculer_param_date("NOW()", $date_orig); break; case 'age_relatif': $col = calculer_param_date($date_compare, $date_orig); break; case 'jour_relatif': $col = "LEAST(TO_DAYS(" .$date_compare . ")-TO_DAYS(" . $date_orig . "), DAYOFMONTH(" . $date_compare . ")-DAYOFMONTH(" . $date_orig . ")+30.4368*(MONTH(" . $date_compare . ")-MONTH(" . $date_orig . "))+365.2422*(YEAR(" . $date_compare . ")-YEAR(" . $date_orig . ")))"; break; case 'mois_relatif': $col = "MONTH(" . $date_compare . ")-MONTH(" . $date_orig . ")+12*(YEAR(" . $date_compare . ")-YEAR(" . $date_orig . "))"; break; case 'annee_relatif': $col = "YEAR(" . $date_compare . ")-YEAR(" . $date_orig . ")"; break; } return $col; }