2017-03-10 33 views
0

如何选择大于指定日期(上次请求日期)的数据并排除created_at和deleted_at大于指定日期的数据?如果两个日期不大于指定日期,则显示SQL Query

例如last_requested_date是'2017-03-09 15:41:00'。 然后,我想显示'2017-03-09 15:41:00'之后创建/更新/删除的国家/地区。但我不想显示国家谁创建,然后在last_requested_date后删除(例如created_at'2017-03-09 15:41:01'和deleted_at'2017-03-09 15:41:02')

我的代码是这样的:

SELECT * FROM countries 
WHERE (created_at > '2017-03-09 15:41:00' OR 
     updated_at > '2017-03-09 15:41:00' OR 
     deleted_at > '2017-03-09 15:41:00') AND 
     NOT (created_at > '2017-03-09 15:41:00' AND deleted_at > '2017-03-09 15:41:00') 

但产量不会是我的预期。任何解决方案将不胜感激!谢谢

+0

您目前的逻辑没有意义。你能包括一些样本数据吗?即使你得到了答案,你的问题也不会对任何人有帮助。 –

回答

0
SELECT * FROM countries 
WHERE (created_at > '2017-03-09 15:41:00' OR 
    updated_at > '2017-03-09 15:41:00' OR 
    deleted_at > '2017-03-09 15:41:00') AND id NOT IN 
    (SELECT id FROM countries where created_at > '2017-03-09 15:41:00' AND deleted_at > '2017-03-09 15:41:00') 
+0

其实我想获得不使用子查询的查询。但这会做!谢谢! – JimmyJS

+0

'NOT IN(SELECT ...)'通常执行_terribly_,但它通常可以变成'LEFT JOIN ... IS NULL'。 –

0

选中此项。

 SELECT * FROM countries 
     WHERE (created_at > '2017-03-09 15:41:00' OR 
       updated_at > '2017-03-09 15:41:00' OR 
       deleted_at > '2017-03-09 15:41:00') AND 

     datediff(SECOND,created_at, deleted_at) > 60 

在这里,我们检查两个日期(created_at和deleted_at)之间的差必须大于60秒,你可以对其进行编辑按要求。

0

如果我正确地强调你的要求,那么你的查询是非常接近产生欲望的结果。您可能需要再添加一个条件来检查创建日期和已删除日期之间的日期差异,以避免今天自行创建和删除的国家/地区。

SELECT * 
FROM countries 
WHERE (created_at > '2017-03-09 15:41:00' OR 
     updated_at > '2017-03-09 15:41:00' OR 
     deleted_at > '2017-03-09 15:41:00' 
    ) AND (created_at > '2017-03-09 15:41:00' AND 
      deleted_at > '2017-03-09 15:41:00' AND 
      DATEDIFF(created_at,deleted_at) > 0)