2016-06-29 8 views
0

Я нашел Postgre, имеющий очень удобную арифметику TIMESTAMP10 и INTERVAL. Но магия также содержит некоторые обманки, которые я обнаружил при выполнении запросов.Как проверить, что INTERVAL является относительным или абсолютным в PostgreSQL

Возникает вопрос:

Есть ли способ определить, если INTERVAL является относительной или абсолютной в Postgre?

Пусть у меня есть столбец с различными INTERVAL с в нем, некоторые из них закодированы как относительной ('1 mon') других кодируются как абсолютной ('30 days').

Поскольку относительная INTERVAL должны быть конвертированы в абсолютном INTERVAL, мы не можем сравнивать их напрямую:

SELECT '1 mon'::INTERVAL = '30 days'::INTERVAL; 

Возвращает TRUE, поэтому мы не можем различить.

Относительные INTERVAL s возникают для грануляций, которые превышают неделю, поскольку неделя является самой большой грануляцией, которая четко определена. Но такой тест не является удовлетворительным:

SELECT some_interval > '1 week'; 

Поскольку falsy обнаружить '21 days'::INTERVAL, как относительная вместо абсолютного.

Я знаю, что одно различие между относительным и абсолютным INTERVAL состоит в том, что арифметика возвращает разные результаты при использовании их с TIMESTAMP.

SELECT '2000-02-01'::TIMESTAMP + '1 mon'::INTERVAL; 
SELECT '2000-02-01'::TIMESTAMP + '30 days'::INTERVAL; 

Первый возвращает '2000-03-01'::TIMESTAMP и последний возвращает '2000-03-02'::TIMESTAMP, которые явно отличаются.

Но это выглядит несколько странно, чтобы проверить относительность генерируя некоторые комбинации арифметики (мы можем пропустить некоторые случаи использования), и он будет не в состоянии различать '1 week'::INTERVAL и '7 days'::INTERVAL (но мы можем предположить, что это хорошо, потому что они действительно равны).

Итак, я ищу встроенный в или самодельныйFUNCTION, который способен обнаружить, если INTERVAL является абсолютным или относительной в Postgre. Есть идеи?

+0

В чем заключается цель различия? –

+0

@ClodoaldoNeto, Что значит? – jlandercy

+0

Я имею в виду, почему вам нужно провести различие между относительным и абсолютным? –

ответ

1

То, что вы называете «относительной» являются временные метки, которые содержат «мон» или «год» (потому что весь месяц не имеет одинаковое количество дней и то же самое в течение многих лет) вы можете проверить его с помощью строки comparaison:

SELECT 
    my_interval 
    ,my_interval::TEXT SIMILAR TO '%(mon|year)%' AS mytest 
FROM my_table 
+0

Я не стремлюсь использовать строковое кастинг при решении проблемы с более высокими типами, но я согласен, что в этом случае это должен быть самый чистый способ сделать это. Спасибо, что указали это. – jlandercy