MySQL Datediff - в чем проблема? - PullRequest
0 голосов
/ 15 января 2019

У меня следующая проблема. Моя база данных выглядит так:

Структура базы данных

Я хочу получить все данные из этой базы данных, которая старше 2 дней, и status = "Betreiber informiert" или status = "Betreiber informiert (manuell)"

Я создал запрос, но он не работает. Кто-нибудь может мне помочь?

Это мой запрос:

SELECT * 
FROM meldungen 
WHERE status = 'Betreiber informiert' 
   OR status = 'Betreiber informiert(manuell)' 
  AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800

Если я использую этот запрос, он выглядит следующим образом:

Результат с моим запросом

Вы видите, что мой запрос выбирает все строки, которые имеют status='Betreiber informiert' или 'Betreiber informiert(manuell)', но дни не учитываются.

Может ли кто-нибудь мне помочь?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Я думаю, вам просто нужно изменить код на следующий:

SELECT * 
FROM meldungen 
WHERE status = 'Betreiber informiert' 
  AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800 
   OR status = 'Betreiber informiert(manuell)' 
  AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800

Вы должны написать AND Задание для каждого OR

С вашим старым кодом он просто ищет "Betreiber informiert" по каждой временной отметке и "Betreiber informiert (manuell)", который старше двух дней.

0 голосов
/ 15 января 2019

172800 - это числа секунд за два полных дня.Если вы действительно хотите сделать это таким образом, тогда вы должны использовать TIMESTAMPDIFF:

SELECT m.*
FROM meldungen m
WHERE
    m.status IN ('Betreiber informiert', 'Betreiber informiert(manuell)') AND
    TIMESTAMPDIFF(SECOND, Meldungszeitpunkt, NOW()) > 172800;

Обратите внимание, что я использую WHERE IN, чтобы избежать проблемы порядка работы между вашими OR s иAND s.AND имеет более высокий приоритет, чем OR, поэтому ваше первоначальное предложение WHERE действительно оценивалось следующим образом:

WHERE
    status = 'Betreiber informiert' OR
    (status = 'Betreiber informiert(manuell)' AND
     DATEDIFF(NOW(), Meldungszeitpunkt) > 172800)
0 голосов
/ 15 января 2019

А? Что такое 172800?

Попробуйте это:

SELECT m.*
FROM meldungen m
WHERE m.status IN ('Betreiber informiert', 'Betreiber informiert(manuell)') AND
      m.Meldungszeitpunkt < NOW() - interval 2 day;

Обратите внимание, что это также упрощает логику для использования IN - потому что я предполагаю, что вы хотите, чтобы условие даты применялось к обоим состояниям. Если вы действительно хотите, чтобы условие даты применялось ко второму, вы должны использовать:

WHERE m.status = 'Betreiber informiert' OR
      (m.status = 'Betreiber informiert(manuell)') AND
       m.Meldungszeitpunkt < NOW() - interval 2 day
      )

Такое толкование кажется мне гораздо менее вероятным (хотя это именно то, что делает ваш запрос).

Возможно, вы захотите curdate() вместо now(), если вы не хотите учитывать время.

...