为什么使用date_part和确切日期参数查询数据在原始日期之间会有不同的结果?

时间:2019-08-26 05:16:23

标签: sql amazon-redshift

我试图计算表中某些列的不同值。 我有逻辑,我尝试用2种方式写 但是我从这两个查询中得到不同的结果。 有人可以帮我澄清一下吗?我不知道代码或我认为是什么问题。

SQL

select count(distinct membership_id) from members_membership m
where date_part(year,m.membership_expires)>=2019
and date_part(month,m.membership_expires)>=7
and date_part(day,m.membership_expires)>=1
and date_part(year,m.membership_creationdate)<=2019
and date_part(month,m.membership_creationdate)<=7
and date_part(day,m.membership_creationdate)<=1
;

select count(distinct membership_id) from members_membership m
where m.membership_expires>='2019-07-01'
and m.membership_creationdate<='2019-07-01'
;

3 个答案:

答案 0 :(得分:0)

我实际上认为这是您要运行的查询:

SELECT
    COUNT(DISTINCT membership_id)
FROM members_membership m
WHERE
    m.membership_expires >= '2019-07-01' AND
    m.membership_creationdate < '2019-07-01';

成员资格在创建的同时到期没有任何意义,因此,如果成员资格在2019年7月1日午夜到期,那么应该严格在该时间点之前创建它。

话虽如此,第一个查询的问题在于,例如,对7月或7月之前的月份的限制将适用于每年年,而不仅限于2019年。很难编写分别使用年,月和日条款的日期不等式。因此,最好使用您使用的第二个版本。它也是可持久的,这意味着可以使用membership_expiresmembership_creationdate上的索引。

答案 1 :(得分:0)

第一个查询存在问题:

select count(distinct membership_id) from members_membership m
where date_part(year,m.membership_expires)>=2019
and date_part(month,m.membership_expires)>=7
and date_part(day,m.membership_expires)>=1
and date_part(year,m.membership_creationdate)<=2019
and date_part(month,m.membership_creationdate)<=7
and date_part(day,m.membership_creationdate)<=1; -- do you think that any day is less than 1?? 
-- this condition will be satisfy by only 01-Jul-2019, But I think you need all the dates before 01-Jul-2019

and date_part(day,m.membership_creationdate)<=1是问题的根源。 甚至membership_creationdate = 15-jan-1901都不满足上述条件。

您需要始终在日期列上使用日期函数,以避免此类问题。 (您的第二个查询很好)

干杯!

答案 2 :(得分:0)

原因可能是由于时间因素造成的。

第一个查询的正确比较是:

select count(distinct membership_id)
from members_membership m
where m.membership_expires >= '2019-07-01' and
      m.membership_creationdate < '2019-07-02'
--------------------------------^ not <= ---^ next day

无论“日期”是否包含时间成分,此逻辑都应起作用。