我在下面有一个名为客户的表是附加图像
{{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';
答案 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')