Получение значения даты в столбце таблицы postgres и проверка, больше ли она текущей даты - PullRequest
0 голосов
/ 18 марта 2011

У меня есть таблица Postgres под названием клиенты. Столбец имени содержит определенные значения, например.

test23233 [987665432,2014-02-18]

В конце значения стоит дата, мне нужно сравнить эту дату и вернуть все записи, где эта конкретная дата моложе, чем сегодня

Я пытался

select id,name FROM clients where name ~ '(\d{4}\-\d{1,2}\-\d{1,2})';

но это не возвращает никаких значений. Как мне достичь желаемых результатов?

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Если данные всегда сохраняются таким образом (т.е. после запятой), я бы не использовал регулярное выражение, а извлекал часть даты и преобразовывал ее в правильный тип даты.

SELECT *
FROM the_table
WHERE to_date(substring(name, strpos(name, ',') + 1, 10), 'yyyy-mm-dd') < current_date

Возможно, вы захотите поместить это to_date (...) в представление, чтобы упростить это для других запросов.

В долгосрочной перспективе вы должны (действительно) попытаться исправить эту модель данных.

0 голосов
/ 18 марта 2011

Я решил свою проблему, выполнив что-то похожее на

select id,substring(name,'[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}'),name FROM clients where substring(name,'[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}') > '2011-03-18';

Возможно, это не лучшая практика, но она работает.Но открыты для лучших предложений

0 голосов
/ 18 марта 2011

Использование регулярного выражения для этого было бы чрезвычайно сложно. Можно ли изменить схему и данные, чтобы разделить имя, каким бы ни было второе значение, и отметку времени в отдельных столбцах? Это было бы намного логичнее, менее подвержено ошибкам и значительно быстрее.

В противном случае, я подозреваю, что вам придется использовать какой-то синтаксический анализ (возможно, регулярное выражение) для извлечения даты, затем преобразовать ее в дату Postgres, а затем сравнить , что , с текущим временем. для каждого отдельного ряда. Ик.

РЕДАКТИРОВАТЬ: На самом деле, это не совсем так плохо ... потому что ваши даты хранятся в удобной для сортировки форме, возможно, что вы могли бы сделать извлечение (будь то с помощью регулярного выражения или что-то еще) и просто сделайте порядковое сравнение со строковым представлением сегодняшней даты, фактически не выполняя никакого преобразования даты для каждой строки. Это все еще некрасиво, и не подтверждает, что дата не (скажем) 2011-99-99. Если вы можете возможно сохранить данные более разумно, сделайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...