首页 > 解决方案 > 为什么在 peroid 日期中使用 date_part 和确切的日期参数查询数据之间的结果不同?

问题描述

我正在尝试计算表中某些列中的不同值。我有一个逻辑,我尝试用 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'
;

标签: sqlamazon-redshift

解决方案


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

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 月或之前的限制将适用于每年,而不仅仅是 2019 年。很难使用年、月和天条款分开。因此,您使用的第二个版本更可取。它也是可搜索的,这意味着可以使用membership_expires或使用索引。membership_creationdate


推荐阅读