У меня проблема с логикой сравнения дат в MySQL и PHP: функции разницы дат возвращают разные результаты для одних и тех же дат. Пример:
SQL
SELECT DATEDIFF('2024-06-02', '2024-05-03 12:57')
30
PHP
$x = date_diff( new DateTime( '2024-06-02' ), new DateTime( '2024-05-03 12:57' ) );
Это вызывает ошибку утверждения, когда я передаю данные, выбранные из БД с критерием where DATEDIFF..., в PHP, который проверяет дату с помощью функции date_diff().
Существует ли строгий эквивалент функции MySQL в PHP (или наоборот), чтобы обе возвращали 29 (или 30)?
Я думаю, что ваше недоразумение может быть связано с процедурным функциональным псевдонимом date_diff(), а не с тем, чем он является на самом деле, DateTime:diff(). Функция PHP не отбрасывает часть времени, как это делает функция Mysql, и разница между этими двумя датами и временем составляет «29 дней плюс немного», из которых вы используете только часть «29 дней». Настоящий вопрос: «Что вы планируете делать с $x?» это повлияет на то, какой ответ будет лучшим, а не только на тот, который даст вам число 30.






Оба должны возвращать 30, но написанный вами PHP-код не учитывает время, поэтому сообщает 29.
Если вы нормализуете оба показателя до полуночи, он сообщит о 30 днях.
echo $x = date_diff(
(new DateTime( '2024-06-02' ))->setTime(0,0),
(new DateTime( '2024-05-03 12:57' ))->setTime(0,0)
)->days;
// Outputs: 30
По сути, здесь вы используете две функции, которые имеют разные цели и механизмы.
MySQL ДАТЕДИФФ()
Эта функция полностью игнорирует временные метки. Таким образом, даже если перекрывающиеся времена добавят или удалят день, это не имеет значения, потому что они просто удаляются, а затем подсчитывается только количество дней между датами. Таким образом, MySQL всегда будет возвращать 30 независимо от времени в обеих частях.
PHP date_diff()
Эта функция проверяет, сколько общего времени существует между двумя объектами DateTime. Здесь важно то, что она также учитывает все время, что означает, что в ответе вы можете получить целый диапазон от около 29 дней до около 31 дня. в зависимости от времени суток в обеих метках времени.
Решения
В вопросе не хватает того, чего бы вы хотели, чтобы произошло. Итак, вот оба подхода к этому. Либо: а) скажите MySQL сделать то же самое, что и PHP, и сравните периоды времени, или б) скажите PHP сделать то же самое, что и MySQL, и игнорировать время.
Если вам нужны целые дни (округленные вниз) между двумя ВРЕМЯ:
Вместо DATEDIFF() используйте DAY с TIMESTAMPDIFF(), чтобы получить количество целых дней между отметками времени.
SELECT
TIMESTAMPDIFF(DAY, '2024-05-03 12:57', '2024-06-02') AS days;
Это MySQL-эквивалент вашего PHP:
echo date_diff(
new DateTime("2024-06-02"),
new DateTime("2024-05-03 12:57")
)->days;
И оба вернутся: 29
Если вы хотите игнорировать время в обеих ситуациях и просто сравнить только две ДАТЫ:
Тогда ваш MySQL:
SELECT
DATEDIFF('2024-06-02', '2024-05-03 12:57') AS days;
Это было бы эквивалентно удалению времени (ну, установке его на 00:00) в PHP:
echo date_diff(
(new DateTime("2024-06-02"))->setTime(0, 0),
(new DateTime("2024-05-03 12:57"))->setTime(0, 0)
)->days;
Что оба выведут: 30
«Это вызывает ошибку утверждения» — что это значит? Можете ли вы поделиться полным и точным сообщением об ошибке, с которой вы столкнулись?