两个unix时间戳之间的Postgresql查询

时间:2016-12-14 13:00:18

标签: sql postgresql

我在下面有一个名为客户的表是附加图像

{{3}}

我想选择年龄在21岁到35岁之间的所有客户,其中dob存储如此" 1403830861"。

我正在尝试以下查询,但没有结果。

select * 
from clients 
where to_timestamp(dob/1000) > timestamp '2014-01-15 00:00:00' 
  and to_timestamp(dob/1000) < timestamp '2016-01-15 23:59:59';

3 个答案:

答案 0 :(得分:2)

根本原因是:

to_timestamp(dob/1000) >  timestamp '2014-01-15 00:00:00' 

在2014-01-15之后 出生的人今天(2016年12月)仅为2年。

因此,除非您的数据库中有2岁的人,否则该条件不会返回任何内容。

写这篇文章的最简单方法是使用age()函数:

select *
from clients
where extract(year from age(to_timestamp(dob::bigint/1000))) between 21 and 35;

那将包括 21岁或35岁的人

如果您将DOB存储为日期字符串(而不是数字字符串),您显然不需要to_timestamp()to_date()将字符串转换为正确的日期:

select *
from clients
where extract(year from age(to_date(dob, 'DD-MM-YYYY'::date))) between 21 and 35;

如果您使用其他格式,我认为您的DOB值以'DD-MM-YYYY'格式存储,请调整to_date()来电。

不相关,但是:将出生日期存储为date列而不是数字会更好

您应 从不 varchar列中存储号码。

答案 1 :(得分:1)

SELECT *
FROM clients
WHERE dob BETWEEN
  EXTRACT(EPOCH FROM date '2014-01-15 00:00:00') AND
  EXTRACT(EPOCH FROM date '2016-01-15 23:59:59');

答案 2 :(得分:0)

您可以使用下一个 SQL 构造

WHERE my_date_field 
    between to_timestamp({period_from}) and to_timestamp({period_to})

或者丑

WHERE my_date_field 
    BETWEEN 
(TIMESTAMP 'epoch' + 1605964659 * INTERVAL '1 second')
          AND
(TIMESTAMP 'epoch' + 1608556659 * INTERVAL '1 second')