Основная причина заключается в следующем:
to_timestamp(dob/1000) > timestamp '2014-01-15 00:00:00'
Любой человек, родившийся после 2014-01-15 будет только 2 года сегодня (декабрь 2016).
Итак, если у вас нет двухлетних людей в вашей базе данных, это условие ничего не вернет.
Самый короткий путь, чтобы написать это, чтобы использовать 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()
.
Unrelated, но: это было бы гораздо лучше хранить дату рождения как date
столбцам, а затем номер.
И вы должны НИКОГДА НЕ магазин номера в varchar
столбцов.
http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –
И почему вы храните дату рождения в качестве номера? Вы должны сохранить это как надлежащий 'DATE' –
Postgres имеет команду' между '. – Sid