MySQL Datediff-问题是什么?

时间:2019-01-15 13:58:28

标签: php mysql sql datediff

我有以下问题。我的数据库如下:

Database structure

我想从该数据库中提取超过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

如果我使用此查询,它看起来像这样:

Result with my query

您可以看到我的查询选择了所有具有status='Betreiber informiert''Betreiber informiert(manuell)'但没有考虑日期的行。

有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

嗯? 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(),除非您要考虑时间。

答案 1 :(得分:2)

172800是整两天内的数量。如果您确实想这样做,则应该使用TIMESTAMPDIFF

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

请注意,我使用WHERE IN来避免ORAND之间的操作顺序问题。 AND的优先级高于OR,因此您原来的WHERE子句实际上是这样评估的:

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

答案 2 :(得分:0)

我认为您只需要将代码更改为以下内容即可:

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信息”,并且搜索两天前的“ Betreiber信息(manuell)”。