我试图计算表中某些列的不同值。 我有逻辑,我尝试用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'
;
答案 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_expires
或membership_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
无论“日期”是否包含时间成分,此逻辑都应起作用。