PHP-эквивалент MySQL DATEDIFF

У меня проблема с логикой сравнения дат в 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)?

«Это вызывает ошибку утверждения» — что это значит? Можете ли вы поделиться полным и точным сообщением об ошибке, с которой вы столкнулись?

Nico Haase 03.05.2024 13:58

Я думаю, что ваше недоразумение может быть связано с процедурным функциональным псевдонимом date_diff(), а не с тем, чем он является на самом деле, DateTime:diff(). Функция PHP не отбрасывает часть времени, как это делает функция Mysql, и разница между этими двумя датами и временем составляет «29 дней плюс немного», из которых вы используете только часть «29 дней». Настоящий вопрос: «Что вы планируете делать с $x?» это повлияет на то, какой ответ будет лучшим, а не только на тот, который даст вам число 30.

Sammitch 03.05.2024 22:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Оба должны возвращать 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

Другие вопросы по теме

Похожие вопросы

Как отображать настраиваемые поля переменных продуктов под названием продукта на главной странице продукта
API AliExpress SDK выдает ошибку «Подпись запроса не соответствует стандартам платформы» при вызове службы aliexpress.affiliate.productdetail.get
Проблемы с обновлением Doctrine ORM с 2.2 до 3.0 с помощью DefaultQuoteStrategy::getColumnName()
Обновить цену продукта WooCommerce на основе настраиваемого поля ввода
Задания импортера нити не выполняются
Пользовательский блок Wordpress Gutenberg, viewScript не загружается во внешнем интерфейсе, когда мой блок вставлен
Отключить кнопку размещения заказа WooCommerce Checkout на основе идентификатора пользователя
Как предварительно заполнить элементы в TomSelect, когда параметры поступают удаленно (вызов API)
Проверка Laravel 11, требующая одного элемента в массиве, должна быть одной из следующих:
Обновите часы в режиме реального времени, передав переменную из PHP в JavaScript