Php MySQL Datediff-问题是什么?
我有以下问题。我的数据库如下所示: 我想从该数据库中获取超过2天的所有数据,以及Php MySQL Datediff-问题是什么?,php,mysql,sql,datediff,Php,Mysql,Sql,Datediff,我有以下问题。我的数据库如下所示: 我想从该数据库中获取超过2天的所有数据,以及status=“Betreiber informiert”或status=“Betreiber informiert(manuell)” 我创建了一个查询,但它不工作。有人能帮我吗 这是我的疑问: SELECT * FROM meldungen WHERE status = 'Betreiber informiert' OR status = 'Betreiber informiert(manuell)
status=“Betreiber informiert”
或status=“Betreiber informiert(manuell)”
我创建了一个查询,但它不工作。有人能帮我吗
这是我的疑问:
SELECT *
FROM meldungen
WHERE status = 'Betreiber informiert'
OR status = 'Betreiber informiert(manuell)'
AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800
如果我使用此查询,它如下所示:
您可以看到我的查询选择了所有具有状态='Betreiber informiert'
或状态'Betreiber informiert(manuell)
但不考虑天数的行
有人能帮我吗?172800是多少
试试这个:
SELECT m.*
FROM meldungen m
WHERE m.status IN ('Betreiber informiert', 'Betreiber informiert(manuell)') AND
m.Meldungszeitpunkt < NOW() - interval 2 day;
对我来说,这种解释似乎不太可能(尽管你的问题就是这样)
你可能想要curdate()
而不是now()
,除非你想把时间考虑进去。嗯?172800是多少
试试这个:
SELECT m.*
FROM meldungen m
WHERE m.status IN ('Betreiber informiert', 'Betreiber informiert(manuell)') AND
m.Meldungszeitpunkt < NOW() - interval 2 day;
对我来说,这种解释似乎不太可能(尽管你的问题就是这样)
你可能想要
curdate()
而不是now()
,除非你想把时间考虑进去。我想你只需要将代码更改为以下内容:
SELECT *
FROM meldungen
WHERE status = 'Betreiber informiert'
AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800
OR status = 'Betreiber informiert(manuell)'
AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800
您必须为每个或
对于您的旧代码,它只是从每个时间戳中搜索“Betreiber informiert”和超过两天的“Betreiber informiert(manuell)”。我认为您只需将代码更改为以下内容:
SELECT *
FROM meldungen
WHERE status = 'Betreiber informiert'
AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800
OR status = 'Betreiber informiert(manuell)'
AND DATEDIFF(NOW(), Meldungszeitpunkt) > 172800
您必须为每个或
对于旧代码,它只需从每个时间戳中搜索“Betreiber informiert”和超过两天的“Betreiber informiert(manuell)”。
172800
是两整天的秒数。如果您真的想这样做,那么应该使用TIMESTAMPDIFF
:
SELECT m.*
FROM meldungen m
WHERE
m.status IN ('Betreiber informiert', 'Betreiber informiert(manuell)') AND
TIMESTAMPDIFF(SECOND, Meldungszeitpunkt, NOW()) > 172800;
请注意,我使用WHERE IN
来避免或
s与和
s之间的操作顺序问题和
的优先级高于或
,因此您原来的WHERE
子句的实际计算结果如下:
WHERE
status = 'Betreiber informiert' OR
(status = 'Betreiber informiert(manuell)' AND
DATEDIFF(NOW(), Meldungszeitpunkt) > 172800)
172800
是两整天的秒数。如果您真的想这样做,那么应该使用TIMESTAMPDIFF
:
SELECT m.*
FROM meldungen m
WHERE
m.status IN ('Betreiber informiert', 'Betreiber informiert(manuell)') AND
TIMESTAMPDIFF(SECOND, Meldungszeitpunkt, NOW()) > 172800;
请注意,我使用WHERE IN
来避免或
s与和
s之间的操作顺序问题和
的优先级高于或
,因此您原来的WHERE
子句的实际计算结果如下:
WHERE
status = 'Betreiber informiert' OR
(status = 'Betreiber informiert(manuell)' AND
DATEDIFF(NOW(), Meldungszeitpunkt) > 172800)
当您混合使用和/或时,查询会变得混乱。最好使用括号来分隔特定的逻辑。
172800
应该代表什么?您的问题不清楚。请以秒为单位计算天数请不要使用这样的屏幕截图,而是转储SHOW create table table name
的create table结果,而不是在混合和/或时,查询会变得混乱。最好使用括号来分隔特定的逻辑。172800
应该代表什么?你的问题不清楚。请不要使用这样的屏幕截图,转储SHOW create table table name
的create table结果,而改为“嗯?172800是什么?试试这个:”-我希望一个代表性很低的成员能给出这样的答案。lol@user2864740 . . . 这是因为明显的变化将发生在日期比较上。中的只是一种简化。这不是Gordon的失误……他的SQL级别相当高,因此像操作顺序这样的琐碎事情可能不值得注意(答案是向上投票)。@TimBiegeleisen我知道这一点。但是这样看吧。如果答案来自新会员或低代表性会员,你会怎么做?我以前见过这样的答案,他们得到了很多反对票。现在要诚实。@FunkFortyNiner。我真的不知道172800
的datediff()值与2天有什么关系。也许OP可以提供启示,尽管这不是获得正确的查询逻辑所必需的。“哈?172800是什么?试试这个:”-我希望一个代表性很低的成员能给出这样的答案。lol@user2864740 . . . 这是因为明显的变化将发生在日期比较上。
中的只是一种简化。这不是Gordon的失误……他的SQL级别相当高,因此像操作顺序这样的琐碎事情可能不值得注意(答案是向上投票)。@TimBiegeleisen我知道这一点。但是这样看吧。如果答案来自新会员或低代表性会员,你会怎么做?我以前见过这样的答案,他们得到了很多反对票。现在要诚实。@FunkFortyNiner。我真的不知道172800
的datediff()值与2天有什么关系。也许OP可以提供启示,尽管这不是为查询获得正确逻辑所必需的。虽然这改变了逻辑(可能是,也可能不是OPs问题),“(A和C)或(B和C)”可以更简单地写为“(A或B)和C”,以避免重复。是的,您也可以这样做,但我喜欢把它组织起来,这样我可以单独改变一切,同时改变逻辑(可能是也可能不是老年退休金计划的问题),“(A和C)或(B和C)”可以更简单地写为“(A或B)和C”,以避免重复。是的,你也可以这样做,但我喜欢组织它,这样我就能改变一切individually@user2864740这是AFAIK的预期逻辑。如果你有理由不这样认为,那么展示一些证据。更新涵盖了“IN”开关-我唯一的问题是缺乏解释。@user2864740这是AFAIK的预期逻辑。如果你有理由不这么认为,那么展示一些证据。更新涵盖了“IN”开关-我唯一的问题是缺乏解释。