我有以下问题。我的数据库如下:
我想从该数据库中提取超过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)'
但没有考虑日期的行。
有人可以帮我吗?
答案 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
来避免OR
和AND
之间的操作顺序问题。 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)”。