2016-12-14 3 views
1

У меня есть таблица под названием клиентов ниже прикрепляются изображенияPostgresql запрос между двумя Отметкой времени Unix

enter image description here

Я хочу, чтобы выбрать все клиент, чьи возраст от 21 года до 35 лет, где д.р. сохраняется как «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

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –

+0

И почему вы храните дату рождения в качестве номера? Вы должны сохранить это как надлежащий 'DATE' –

+0

Postgres имеет команду' между '. – Sid

ответ

2

Основная причина заключается в следующем:

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 столбцов.

+0

Выполнения упомянутого запроса дает ошибку 'ОШИБКА: оператор не существует: символ изменяющийся/целое ЛИНИЯ 3: где экстракт (год от возраста (to_timestamp (д.р./1000))) между ... ^ ПОДСКАЗКОЙ: Нет оператор соответствует указанному имени и типу аргументов. Возможно, вам придется добавить явные типы casts.' – Gagan

+0

@gagan: Я упустил из виду, что ваше определение 'dob' еще хуже, чем я думал. Вам нужно передать строку в нужное число - см. Мое редактирование. Бу, почему ты хранишь числа в «варчаре»?Хранение «даты» как числа уже плохой выбор дизайна, но сохранение числа в varchar еще хуже –

+0

Я понимаю, но проблема в том, что это приложение очень старое и не хочет рисковать в этот момент времени. Теперь другая ошибка ошибка SQL: 'ОШИБКА: неверный входной синтаксис для целого числа:«04-05-1991»' – Gagan

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'); 
+0

. Возможно, вы захотите объяснить преимущество этого запроса: он _can_ используйте индекс на 'dob' - однако он все равно не вернет людей в возрасте от 21 до 45 лет –

Смежные вопросы