查询以获取未来几年的最新记录也将获取新添加的数据

时间:2018-12-26 10:49:26

标签: sql

我有一个场景,其中我将一个新用户添加到员工管理系统中的系统中。现在假设我将用户的加入日期存储为2018年12月26日,即今天的日期,现在我尝试获取所有用户即将到来的工作周年纪念日。当前添加的用户也会在即将到来的工作周年纪念日出现。这是错误的,因为只是添加了用户,而且显然他的工作纪念日要到明年才能到期。

这是我的查询

SELECT  
    "users".* 
FROM 
    "users" 
    INNER JOIN "groups_users"
        ON "groups_users"."user_id" = "users"."id" 
    INNER JOIN "groups"
        ON "groups"."id" = "groups_users"."group_id" 
WHERE 
    "users"."organisation_id" = 24 
    AND "users"."status" = 1     
    AND ("users"."joining_date" IS NOT NULL) 
GROUP BY
    users.id  
ORDER BY 
    (to_char(to_date((to_char(current_date,'yyyy')
        || to_char(joining_date,'-MM-DD')), 'YYYY-MM-DD')::date,'ddd')::int
        - to_char(current_date,'ddd')::int
        + to_char((to_char(current_date,'yyyy')||'-12-31')::date,'ddd')::int)
        % to_char((to_char(current_date,'yyyy')||'-12-31')::date,'ddd')::int,
    first_name 
LIMIT 30
OFFSET 0

现在,如果我今天添加一个名为Ramesh Mesta的新用户,即2018年12月26日 ,这将返回以下集合

746 "Ramesh" "Mesta"    
7056 "Tavira" "danial"  
7057 "Bired" "leve" 
6918 "cIvankatrump" "Trumphivsnka"    

在这里拥有Ramesh Mesta并不有意义,因为他是刚刚创建的。 艾米帮助

2 个答案:

答案 0 :(得分:0)

您的ORDER BY逻辑对于获取即将到来的周年纪念日并没有真正有效地工作,我建议删除它并使用下面的WHERE子句,然后对ORDER BYjoining_date。将其添加到您现有的WHERE子句中,我已经用10天(355 = 365-10)作为“即将到来”的解释,但是如果您希望使用不同的跨度,当然可以更改此设置。

(current_date - joining_date) % 365  > 355 

请注意,这不包括今天的周年纪念日,因此,如果需要,您需要“喜欢”或

   (current_date - joining_date) % 365  > 355
OR (current_date - joining_date) % 365 = 0

ORDER BY现在可以简化为

ORDER BY joining_date ASC

答案 1 :(得分:-1)

  

当前添加的用户也会在即将到来的工作周年纪念日出现。这是错误的,因为只是添加了用户,而且显然他的工作纪念日要到明年才能到期。

仅修改WHERE子句以过滤掉今天创建的用户怎么样?

在Oracle中:

...
WHERE 
    "users"."organisation_id" = 24 
    AND "users"."status" = 1     
    AND "users"."joining_date" < trunc(sysdate)
...

在Postgres中:

...
WHERE 
    "users"."organisation_id" = 24 
    AND "users"."status" = 1     
    AND "users"."joining_date" < CURRENT_DATE
...