SQL

Как в бд сверять прошло ли определённое время (К примеру 24ч.) после указаной даты в базе?

  • Допустим у меня есть таблица в которой хранится время в формате date('Y-m-d h:i:s'); мне в php нужно на выходе получить количество секунд до того как пройдёт данное время, пример:
 function get_time($time_db, $time) {
$second = $time_db - $time;
return $second;
}

$time_db = $db->query("SELECT `time` FROM `get_free` WHERE '$name'");
$time = date('Y-m-d h:i:s');

get_time($time_db, $time)
  • А также подскажите каким образом хранить и записывать дату и время и время в бд, если выражаться по точнее подскажите что выбирать здесь
И как производится UPDATE и INSERT INTO ?
Denis .8787
Denis .8787
1 458
Да, DATETIME - лучший вариант, если надо хранить дату + время.

Дата в MySQL записывается и читается в виде строки формата 'Y-m-d H:i:s': именно 'H', а не 'h' - c ведущим нулём. Это позволяет сравнивать значения как строки - без преобразования к числу timestamp или объекту даты/времени.

Разницу в секундах можно получить, преобразовав строку с датой в timestamp и отняв timestamp текущего момента:
 $diff = strtotime($time) - time(); 
Где $time - полученное из БД значение даты/времени.
ВА
Владимир Антипин
89 844
Лучший ответ
Как и отметил Андрей (выше), лучший вариант - это DATETIME. Немного расширю его ответ.
Но начну с того, что я немного пофикшу твой код - SQL-инъекции, ибо у тебя нет даже подготовленных запросов или хотя бы mysqli_real_escape_string, а обычной инкапсуляцией тебе тут не обойтись, хоть это и эффективный метод защиты от инъекций. Но не суть.

Текущую дату можно записывать даже без объявления какой либо переменной, используя значение времени NOW() выражением INSERT INTO. То-есть:
 $db->prepare("INSERT INTO get_free (name, time) VALUES (?, NOW())"); 
$db->bindValue(1, $name, PDO::PARAM_STR);
$db->execute();
Это вставит текущую дату и время со значением NOW(), что эквивалентно использованию функции date('Y-m-d h:i:s'). Аналогично для обновления записей в базе данных можно использовать ключевое слово UPDATE, имя таблицы, а затем значения, которое нужно обновить:
 $db->prepare("UPDATE get_free SET time = NOW() WHERE name = ?"); 
$db->bindValue(1, $name, PDO::PARAM_STR);
$db->execute();
В случае сравнения времени - все немного сложнее. Я не особо понимаю что за мешанина у тебя в коде, но для твоих действий можно использовать метод TIMESTAMPDIFF() для вычисления количества секунд между текущим временем, который можно получить с помощью значения NOW() и временем, хранящимся в базе данных. Примерно так:
 function get_time($name, $db) { 
$query = $db->prepare("SELECT TIMESTAMPDIFF(SECOND, time, NOW()) AS seconds FROM get_free WHERE name = ?");
$query->bindValue(1, $name, PDO::PARAM_STR);
$query->execute();
$result = $query->fetch(PDO::FETCH_ASSOC);
return $result['seconds'];
}