php comparando fechas

tengo una tabla con dos campos

competition {stateTime, endTime}

cuando inserto en esa tabla, quiero asegurarme de que el valor que quiero insertar no esté en el período de ninguna fila en esa tabla, escribo esta función (Base de datos PDO)

function isCompetitionInAnotherCompetition($startTime, $endTime) {
        $query = "SELECT * FROM competition";
        $sth = $this->db->prepare($query);
        $sth->execute(array());
        while ($row = $sth->fetch()) {
            if ($startTime >= $row['startTime'] && $startTime <= $row['endTime'])
                return true;
            if ($endTime >= $row['startTime'] && $endTime <= $row['endTime'])
                return true;
        }
        return false;
    }

pero no funciona bien, cada fecha en la base de datos es yyyy-mm-dd, ejemplo 2012-01-15

preguntado el 01 de julio de 12 a las 15:07

¿Por qué no simplemente usar BETWEEN or < > <= >= en la WHERE cláusula de la instrucción SQL y utilizar el recuento de filas de salida? -

@AlvinWong lo intentaré -

@AlvinWong funciona, escríbalo como respuesta para aceptarlo -

1 Respuestas

¿Puedo sugerir que, en lugar de escribir una función que pruebe la existencia y devuelva un bool que devuelva los registros, de esta manera puede probar más tarde si no se devolvió ninguno, pero si lo hubo, puede usarlos si es necesario? Como sugiere Alvin Wong, puedes usar BETWEEN en tu sql para que obtengas algo como esto.

function getCompetitionsBetween($startTime, $endTime) {     

    $startTime = date("Y-m-d", $startTime);
    $endTome = date("Y-m-d", $startTime);

    $query = "SELECT * FROM competition 
               WHERE start_time BETWEEN ? AND ? 
               OR end_time BETWEEN ? AND ?";

    $sth = $this->db->prepare( $query );

    $sth->execute( array($startTime, $endTime, $startTime, $endTime) );

    return $sth->fetchAll();
}

y más tarde/en otro lugar

$competitions = getCompetitionsBetween($startTime, $endTime);

if (empty(competitions)) {
    $this->save();
} else {
    echo ('sorry the following competitions conflict with these dates');
    foreach($competitions as $k => $v) {
        echo ($k . ':' . $v);
    }
}

Respondido 01 Jul 12, 16:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.