Я пытаюсь получить данные за текущую дату в MySQL. У меня есть столбец с именем created_at , в котором хранятся дата и время (2017-12-31 11:32:54) с помощью функции NOW() с использованием операторов,

    $stmt = $this->conn->prepare("INSERT INTO log(id, name, created_at) VALUES(?, ?, NOW())");
    $stmt->bind_param("ss", $id, $name);
    $result = $stmt->execute();

Теперь я хочу игнорировать время в столбце created_at и получить данные текущей даты (сегодняшняя дата).

Я пробовал использовать этот запрос,

SELECT * FROM log WHERE created_at = DATE_SUB(CURDATE(), INTERVAL 0 DAY)

Но это приводит к zero rows selected.

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

7
Vishist Varugeese 31 Дек 2017 в 14:35

2 ответа

Лучший ответ

Один из вариантов - заключить created_at в DATE(), а затем сравнить с CURDATE():

SELECT *
FROM log
WHERE DATE(created_at) = CURDATE();

Но у этого есть недостаток, заключающийся в том, что исключается возможность использования индекса в столбце created_at. Мы могли бы также сформулировать это так:

SELECT *
FROM log
WHERE created_at >= CURDATE() AND created_at < CURDATE() + INTERVAL 1 DAY;

Это позволило бы использовать индекс для created_at, хотя он немного более подробный.

10
Tim Biegeleisen 31 Дек 2017 в 11:45

Это тоже будет работать

SELECT *
FROM log
WHERE  DATE(created_at, '%Y-%m-%d')  = CURDATE();
2
Kiwagi 31 Дек 2017 в 11:58