Sql 仅平均有效日期

Sql 仅平均有效日期,sql,postgresql,Sql,Postgresql,我有一个简单的搜索查询,如下所示: SELECT COUNT(id), COUNT(CASE WHEN nation = 'german' THEN 1 END), COUNT(CASE WHEN nation = 'french' THEN 1 END), AVG(AGE(birthday)) FROM persons; 我的问题是我得到了一个错误: ERROR: date out of range for timestamp 我

我有一个简单的搜索查询,如下所示:

 SELECT COUNT(id),
        COUNT(CASE WHEN nation = 'german' THEN 1 END),
        COUNT(CASE WHEN nation = 'french' THEN 1 END),

        AVG(AGE(birthday))

 FROM persons;
我的问题是我得到了一个错误:

  ERROR: date out of range for timestamp
我想我之所以会出现这个错误,是因为不是每个
都保存了
生日

生日
是一个
日期字段

我怎样才能防止这个错误,并且只有平均的生日才是有效的日期?谢谢

SELECT COUNT(id),
        COUNT(CASE WHEN nation = 'german' THEN 1 END),
        COUNT(CASE WHEN nation = 'french' THEN 1 END),

        AVG(AGE(COALESCE(birthday, 0) ))

 FROM persons where birthday is not null;

我将使用另一个case语句从
avg(age())
计算中排除无效的空值:

SELECT 
  COUNT(id),
  COUNT(CASE WHEN nation = 'german' THEN 1 END),
  COUNT(CASE WHEN nation = 'french' THEN 1 END),
  AVG(CASE WHEN birthday IS NOT NULL THEN AGE(birthday) END)
FROM persons;
如果要添加一个
where birth not null
子句,则平均值是正确的(或尽可能正确),但由于排除的行未被计数,计数将被关闭


看到这一点,请注意两个查询之间的计数差异。

这些记录是从整个结果集中排除,还是仅排除在平均值之外?@DStanley仅排除在平均值之外!日期字段不是PostgreSQL中的类型。
age()。理想情况下,一些测试数据和期望的结果也是如此。谢谢,但得到了相同的错误,@JohnSmith:-更新了我的答案。请现在检查!但是零可能会严重偏离平均值!只需添加一个“WHERE birth IS NOT NULL”WHERE子句。@JuliusDavies:-已更新。!谢天谢地,如果把没有有效生日的人排除在外,即使平均数可能更好,计数也会不正确。你的答案似乎是正确的!但是我仍然得到错误
错误:日期超出时间戳的范围
似乎数据库中有错误的数据!我能做什么?嗯,我猜生日栏中可能有一个无效的值-在这方面帮不了你。尝试按生日排序,查看最高/最低值以查看是否有任何异常。我如何在平均值中检查年龄在0到100岁之间?也许这可以解决问题!谢谢@JohnSmith
avg(当生日不为null时,提取(从年龄(生日)算起的年份)介于0和100之间,然后年龄(生日)结束)
@JohnSmith时间戳数据类型的范围是从公元前4713年到公元294276年,因此我真的怀疑您是否有任何超出范围的值,但请务必尝试运行
选择id,年龄(生日)来自生日不为null的人员,查看是否抛出相同的错误。