我有一个场景,其中我将一个新用户添加到员工管理系统中的系统中。现在假设我将用户的加入日期存储为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并不有意义,因为他是刚刚创建的。 艾米帮助
答案 0 :(得分:0)
您的ORDER BY
逻辑对于获取即将到来的周年纪念日并没有真正有效地工作,我建议删除它并使用下面的WHERE
子句,然后对ORDER BY
做joining_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
...