In postgres 9.2 a new family of data types were added called Ranges. This is a quick overview of how to use them.

### Range Types

There are a handful of built in range types that cover the expected number and date types and you can also define your own if you need something outside of that.

## Basic Operations

**Defining Range**- CREATE TABLE ranges (range int4range)**Inserting Range**- INSERT INTO ranges VALUES('[1, 4]')**Infinate Ranges**- INSERT INTO ranges VALUES('[4, infinity]')**Check Range Membership**- SELECT * FROM ranges where range @> 2**Get Range Bounds**- SELECT lower(range), upper(range) FROM ranges

## Defining Ranges Values

You can define *inclusive* ranges using [2,3] and *exclusive* ranges using (1,4). You can also *mix* them [2,4). You can create *infinate ranges* like [4, infinaty] or [-infinity, 4] and you can test for infinity using *lower_inf* and *upper_inf*. Keep in mind that creating a range like [NULL, 4] will create a unbound lower range. This will act like [infinity, 4] but you wont be able to test for infinity since NULL is still distinct from infinity.

## Non-Overlapping Ranges

I find that when using ranges you often need to create non-overlapping ranges. You can add such a condition using like:

```
CREATE TABLE ranges (
range int4range,
EXCLUDE USING gist (range WITH &&)
);
```