Ошибка SQL 42601 при выполнении запроса в postgreSQL

Я пытаюсь выполнить следующий запрос, используя библиотеку PHP PDO для таблицы базы данных pgSQL.

SELECT COUNT(*) AS overall, COUNT(IF(username = ?, TRUE, NULL)) AS unames FROM login_attempt WHERE last_checked > NOW() - INTERVAL ? MICROSECOND

но получаю следующую ошибку

Ошибка: SQLSTATE[42601]: Синтаксическая ошибка: 7 ОШИБКА: синтаксическая ошибка в или около "$2" СТРОКА 1: ...gin_attempt WHERE last_checked > NOW() - INTERVAL $2 MICROSE... ^

вот мой полный код функции

private function isQueueSizeExceeded()
{

    $sql = "SELECT COUNT(*) AS overall, COUNT(IF(username = :uname, TRUE, NULL)) AS unames FROM login_attempt WHERE last_checked > NOW() - INTERVAL :itime MICROSECOND";
    $stmt = $this->pdo->prepare($sql);

    $itime= 5000 * 1000;
    $stmt->bindParam(':uname', $this->username);
    $stmt->bindParam(':itime', $itime);
    $stmt->execute();

    $count = $stmt->fetch(PDO::FETCH_OBJ);
    if (!$count) {
        throw new Exception("Failed to query queue size", 500);
    }

    return ($count->overall >= self::MAX_OVERALL || $count->unames >= self::MAX_PER_USER);
}

ожидается, что этот код будет работать с использованием MySQL, но я пытаюсь запустить с помощью postgreSQL


person Muhammad Hamza Shahid    schedule 17.05.2017    source источник
comment
У Postgres и MySQL очень разный синтаксис. Почему вы ожидаете, что это будет работать без ошибок?   -  person Tim Biegeleisen    schedule 17.05.2017
comment
postgres IF - это plpgsql, используйте CASE WHEN вместо sql   -  person Vao Tsun    schedule 17.05.2017


Ответы (1)


Синтаксис DATATYPE 'string' работает только для строковых литералов, а MICROSECONDS должен быть частью строки.

Вместо этого вы можете использовать приведение типа:

... current_timestamp - CAST((:itime || ' microseconds') AS interval)
person Laurenz Albe    schedule 17.05.2017