SQL查询未按预期运行(之间)

时间:2019-06-03 08:05:19

标签: sql postgresql

我有以下查询(在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年之间

3 个答案:

答案 0 :(得分:0)

demo:db<>fiddle

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年的成员。