2015-01-22 6 views
2

Я хочу получить разницу между двумя датами в моем запросе. Я попытался с помощью множественного выбора заявление, но это не работаетПолучить разницу по дате

Вот мой код

$tbl_name = "myTable"; 
$setDay = "10"; 

$stmt = $pdo->query("SELECT * (
       SELECT due_date, 
        date_paid, 
        DATEDIFF(due_date, date_paid) as date_interval) 
       FROM $tbl_name 
       WHERE DATEDIFF(due_date, date_paid) <= $setDay 
       ORDER BY trans_id DESC LIMIT $start, $limit"); 
$stmt->execute(); 

Благодаря

+0

Эта строка: ГДЕ DATEDIFF (due_date, date_paid) <= $ setDay вызывает ошибку. – Matheno

ответ

2

Важно развивать вас MySQL сначала запрашивает и совершенствует их вне контекста PHP-кода, а затем интегрирует запрос, когда он работает так, как вам нужно, до в M ySQL клиентское приложение как MySQL Workbench, PHPMyAdmin и т.д.

В запросе, внешний SELECT не нужен, и сам внутренний запрос выглядит почти правильно, но это, как вы пытаетесь выполнить его с PDO, который неисправна.

SELECT 
    due_date, 
    date_paid, 
    DATEDIFF(due_date, date_paid) as date_interval 
FROM $tbl_name 
WHERE 
    DATEDIFF(due_date, date_paid) <= $setDay 
ORDER BY trans_id DESC 
LIMIT $start, $limit 

Теперь, чтобы выполнить его в PDO, вы должны использовать prepare()/bindParam()/execute() создать подготовленное заявление, связываются в параметрах, и выполнить его с этими параметрами (вы не можете связать имя таблицы, хотя - что должно оставаться переменной) , В вашем текущем коде вы смешиваете метод PDO::query(), используемый для простых статических запросов, и метод PDOStatement::execute(), который используется для выполнения подготовленного оператора. Вы должны использовать метод подготовленных операторов, а не query().

// Setup the statement with named parameters like :setDay 
$sql = " 
    SELECT 
     due_date, 
     date_paid, 
     DATEDIFF(due_date, date_paid) as date_interval 
    FROM $tbl_name 
    WHERE 
     DATEDIFF(due_date, date_paid) <= :setDay 
    ORDER BY trans_id DESC 
    LIMIT :start, :limit 
"; 
// Make PDO throw useful errors on failure 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

// Prepare the statement 
$stmt = $pdo->prepare($sql); 

// Bind your 3 parameters and execute it 
$stmt->bindParam(':setDay', $setDay, PDO::PARAM_INT); 
$stmt->bindParam(':start', $start, PDO::PARAM_INT); 
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT); 
$stmt->execute(); 

// Fetch your rows returned from the query 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
// Do something with them 
print_r($rows); 

Я всегда рекомендую проводить время с this PDO tutorial for MySQL developers который ставит использование PDO в контексте старой mysql_*() API может быть уже знакомы.

+0

Спасибо. Но мне также нужен внешний выбор, чтобы отображать другие поля в таблице, поэтому я добавил его. Как достичь этого, потому что результат все тот же, что и старый. Спасибо – Chidi

+0

Вам не нужен внешний выбор - вы просто добавляете дополнительные поля в список «SELECT». Вы имеете дело только с одной таблицей и без агрегации, поэтому нет необходимости в подзапросе. –

+0

Вам нужно будет уточнить свой вопрос, если вам нужна дополнительная информация, которая не встречается. Условие 'WHERE', в котором вы указываете ошибку, является _not_ faulty, если вы не используете этот подзапрос с закрывающим') 'в неправильном месте. Как и сейчас, вы можете добавить столько дополнительных полей, сколько необходимо для 'SELECT'. –

-1

Используйте это, чтобы найти дату defference,

 $diff=date_diff($date1,$date2); 
+0

OP должен вычислять разницу внутри запроса, для использования в условии WHERE, а не снаружи в PHP. –

0

Попробуйте это,

SELECT * , (select (DATEDIFF(due_date,date_paid)) AS date_interval) FROM $tbl_name 
Смежные вопросы