Ошибка совпадения дат в PDO - PullRequest
0 голосов
/ 26 июня 2018

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

Неверное значение даты и времени: «% 2018-06%» для столбца «create_at»

Это то, что я делаю

$current_month = date("Y-m");
$points = 4;
$freelancer_id =4;
$update = "UPDATE monthly_limits SET points = :points WHERE freelancer_id = :freelancer_id AND 
created_at LIKE concat('%', :current_month, '%')";
$query = $this->db->prepare($update);
$query->bindParam("points", $points);
$query->bindParam("current_month", $current_month);
$query->bindParam("freelancer_id", $freelancer_id);
$query->execute();

Пожалуйста, как мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Нельзя использовать подстановочные знаки с датами и значением БД в качестве даты.

Было бы гораздо лучше получить даты, которые вы хотите сравнить, и использовать их напрямую:

$current_year = date("Y"); 
$current_month = date("mm");
$points = 4;
$freelancer_id =4;
//Use the SQL version you have to get the date parts this is general.
$update = "UPDATE monthly_limits SET points = :points WHERE freelancer_id = :freelancer_id AND 
        MONTH(created_at) = :current_month AND YEAR(created_at) = :current_year";
        $query = $this->db->prepare($update);
        $query->bindParam("points", $points);
        //Separated these
        $query->bindParam("current_month", $current_month);
        $query->bindParam("current_month", $current_year);
        $query->bindParam("freelancer_id", $freelancer_id);
        $query->execute();
0 голосов
/ 26 июня 2018

Чтобы воспользоваться индексами, я бы предложил вам использовать полные даты. Просто установите одну дату в начале месяца, а другую - в конец месяца и найдите даты в этом диапазоне:

$date_start = date('Y-m-1 00:00:00');
$date_end = date('Y-m-t 23:59:59');

$points = 4;
$freelancer_id =4;
$query = $this->db->prepare("UPDATE monthly_limits 
    SET points = :points 
    WHERE freelancer_id = :freelancer_id 
    AND created_at >= :date_start
    AND created_at <= :date_end"
);
$query->bindParam("points", $points);
$query->bindParam("date_start", $date_start);
$query->bindParam("date_end", $date_end);
$query->bindParam("freelancer_id", $freelancer_id);
$query->execute();
0 голосов
/ 26 июня 2018

Это не то, как даты работают в базе данных SQL. Оператор like предназначен для использования со строковыми типами, тогда как даты - это прославленное число. Учитывая стиль параметров, я держу пари, что вам лучше всего сделать две проверки разницы. Один на месяц и один на год.

Вы не указали свою РСУБД, поэтому я дам ответ MySQL.

UPDATE 
  monthly_limits SET points = :points 
WHERE 
  freelancer_id         = :freelancer_id 
  AND Year(created_at)  = :current_year
  AND Month(created_at) = :current_month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...