仅在未来60天内没有日期时选择

时间:2015-08-04 13:06:53

标签: sql postgresql date

我想发出一个SQL请求来显示用户列表,但只显示自至少60天以来尚未接受任务的用户列表。用户有多个用户任务附加到他身上,因此我需要查看所有这些任务并仅在60天内未接受任务时显示用户。

这是我到目前为止所做的,但这是错误的,即使他已经接受了不到60天前的任务,用户仍然在列表中,但是任务并没有显示出来。所以这个请求只显示60天前被接受的每个任务。那不是我想要的。

SELECT
  u.username, u.id, u.email, date_part('days', now() - um.date_accepted) as "days since last mission"
FROM
  users_user u
INNER JOIN
  users_usermission um
ON
  u.id=um.user_id
WHERE
  date_part('days', now() - um.date_accepted) > 60

3 个答案:

答案 0 :(得分:1)

您可以使用聚合和左连接来执行您想要的操作。我会这样做:

SELECT u.username, u.id, u.email,
       date_part('days', now() - um.date_accepted) as "days since last mission"
FROM users_user u LEFT JOIN
     (SELECT um.user_id, MAX(date_accepted) as maxda
      FROM users_usermission um
      GROUP BY um.user_id
     ) um
     ON u.id = um.user_id
WHERE maxda <= CURRENT_DATE - interval '60 days' or
      maxda IS NULL;

我不确定SELECT子句中的复杂计算是什么,但我将其留在其中。它似乎不是您问题的一部分。

答案 1 :(得分:1)

我认为使用相关not exists谓词的查询会起作用:

SELECT 
    *
FROM
    users_user u
WHERE NOT EXISTS (
    SELECT 1 FROM  users_usermission um
    WHERE u.id = um.user_id  
      AND um.date_accepted > CURRENT_DATE - interval '60 days'
);

这只会返回过去60天内没有任何任务的用户。

有关示例,请参阅此sample SQL Fiddle

答案 2 :(得分:0)

这应该会给你一些想法...

select workername, workerdoj, now()::date - workerdoj::date as days from workers where now()::date - workerdoj::date > 60

它返回所有来自DOJ的天数的被雇用者&gt; 60,您可以根据您的场景进行修改。希望这有帮助