Пример #1
0
/**
 * 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);
}
Пример #2
0
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;
}