我有以下查询(在PostgreSQL中),
select distinct
"bookings"."memberId"
from "shifts"
inner join "bookings"
on "bookings"."shiftId" = "shifts"."id"
where "shifts"."startTime" not between '2016-01-02 00:00:00.000' and '2020-01-01 23:59:59.999'
and "shifts"."startTime" >= '2015-01-01 00:00:00.000'
and "shifts"."startTime" <= '2016-01-01 23:59:59.999'
and "bookings"."state" in ('ACCEPTED')
我试图选择一些不在2016年至2020年之间但在2015年至2016年之间的memberId,但是,查询仍然返回的memberId实际上是在2016年至2020年之间
答案 0 :(得分:0)
WHERE start_time::date BETWEEN '2015-01-01' AND '2015-12-31'
::date
强制转换将时间戳截断为其日期部分。因此,您无需检查时间。
否则,您可以使用date_part
函数仅检查年份:
WHERE date_part('year', start_time) = 2015
在您的示例中,您还包括了2016-01-01。所以这当然是:
WHERE start_time::date BETWEEN '2015-01-01' AND '2016-01-01'
答案 1 :(得分:0)
不需要"shifts"."startTime" not between '2016-01-02 00:00:00.000' and '2020-01-01 23:59:59.999'
select distinct
"bookings"."memberId"
from "shifts"
inner join "bookings"
on "bookings"."shiftId" = "shifts"."id"
where
"shifts"."startTime" >= '2015-01-01 00:00:00.000'
and "shifts"."startTime" <= '2016-01-01 23:59:59.999'
and "bookings"."state" in ('ACCEPTED')
答案 2 :(得分:0)
您似乎想要聚合:
select b."memberId"
from "shifts" s join
"bookings" b
on b."shiftId" = s."id"
where s."startTime" >= '2015-01-01' and
b."state" in ('ACCEPTED')
group by b."memberId"
having max(s."startTime") < '2016-01-01' ;
注意:这基于问题而不是您现有的查询中使用日期/时间。您可能需要调整它们(我不确定为什么要在1月2日,例如WHERE
子句中。)
这将获取2015年或之后的所有行,并按会员ID进行汇总。 HAVING
子句仅选择最大日期为2015年的成员。