【问题标题】:Query for Age calculation and Date comparison inconsistent查询年龄计算和日期比较不一致
【发布时间】:2020-08-26 20:47:01
【问题描述】:

我正在做一些计数来验证表 XXX,我设计了 2 个查询来计算 18 岁以下的人。

我使用的查询如下:

select count(distinct user.id) from user
left join sometable on sometable.id = user.someTableId
left join anotherTable on sometable.anotherTableId = anotherTable.id
where (sometable.id = 'x' or user.public = true) 
AND (DATE_PART('year', age(current_date, user.birthdate)) >= 0 and DATE_PART('year', age(current_date, user.birthdate)) <= 18);

这个查询给出了 5000 个计数(假结果)

但是这个查询应该做同样的事情:

select count(distinct user.id) from user
left join sometable on sometable.id = user.someTableId
left join anotherTable on sometable.anotherTableId = anotherTable.id
where (sometable.id = 'x' or user.public = true) 
and (user.birthdate between '2002-08-26' and current_date)

旁注:日期“2002-08-26”是因为今天是 2020-08-26,所以我从今天的日期减去 18 年。

给我的计数与第一个不同。 (最后一个是正确的,因为和我在另一个nosql数据库中的一样)

我想知道查询的不同之处或计数不同的原因。

提前致谢。

【问题讨论】:

  • 恕我直言,这两个条件应该返回相同的结果,实际区别是什么?一些备注:age(user.birthdate),不需要 current_date,current_date - interval '18' year 而不是硬编码的 '2002-08-26' 和标准 SQL extract(year from age(user.birthdate)) 而不是 DATE_PART

标签: sql postgresql date


【解决方案1】:

在您的第一个查询中,您包括尚未满 19 岁的所有人。

在您的第二个查询中,您排除了 2002 年 8 月 26 日之前出生的 18 岁儿童。例如,2002 年 4 月 12 日出生的人仍然是 18 岁。她要到 2021 年 4 月 12 日才满 19 岁。

用 postgres 编写最简单的方法是这样,它提供与您的第一个查询相同的结果:

    where extract(year from age(now(), birthdate)) <= 18

如果您真的想使用第二个查询的格式,请将您的行更改为:

    where (birth_date between '2001-08-27' and current_date)

【讨论】:

  • 或者只是:where extract(year from age(birthdate)) &lt;= 18
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多