# PostgreSQL Prático/Funções Internas/Data e Hora
## 5.4 – Funções de Data/Hora

Operações com datas:
timestamp '2001-09-28 01:00' + interval '23 hours' -> timestamp '2001-09-29 00:00'
date '2001-09-28' + interval '1 hour' -> timestamp '2001-09-28 01:00'
date '01/01/2006' – date '31/01/2006'
time '01:00' + interval '3 hours'time -> '04:00'
interval '2 hours' - time '05:00' -> time '03:00:00'
Função age (retorna Interval) - Diferença entre datas
age(timestamp)interval (Subtrai de hoje)
age(timestamp '1957-06-13') -> 43 years 8 mons 3 days
age(timestamp, timestamp)interval Subtrai os argumentos
age('2001-04-10', timestamp '1957-06-13') -> 43 years 9 mons 27 days
Função extract (retorna double)
Extrai parte da data: ano, mês, dia, hora, minuto, segundo.
select extract(year from age('2001-04-10', timestamp '1957-06-13'))
select extract(month from age('2001-04-10', timestamp '1957-06-13'))
select extract(day from age('2001-04-10', timestamp '1957-06-13'))
Data e Hora atuais (retornam data ou hora)
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT CURRENT_TIME(0);
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP(0);
Somar dias e horas a uma data:
SELECT CAST('06/04/2006' AS DATE) + INTERVAL '27 DAYS' AS Data;
Função now (retorna timestamp with zone)
now - Data e hora corrente (timestamp with zone);
Não usar em campos somente timestamp.
Função date_part (retorna double)
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Resultado: 16 (day é uma string, diferente de extract)
Obtendo o dia da data atual:
SELECT DATE_PART('DAY', CURRENT_TIMESTAMP) AS dia;
Obtendo o mês da data atual:
SELECT DATE_PART('MONTH', CURRENT_TIMESTAMP) AS mes;
Obtendo o ano da data atual:
SELECT DATE_PART('YEAR', CURRENT_TIMESTAMP) AS ano;
Função date_trunc (retorna timestamp)
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Retorna 2001-02-16 00:00:00
Convertendo (CAST)
select to_date('1983-07-18', 'YYYY-MM-DD')
select to_date('19830718', 'YYYYMMDD')
Função timeofday (retorna texto)
select timeofday -> Fri Feb 24 10:07:32.000126 2006 BRT
Interval
interval [ (p) ]
to_char(interval '15h 2m 12s', 'HH24:MI:SS')
date '2001-09-28' + interval '1 hour'
interval '1 day' + interval '1 hour'
interval '1 day' - interval '1 hour'
900 * interval '1 second'
Interval trabalha com as unidades: second, minute, hour, day, week, month, year, decade, century, millenium ou abreviaturas ou plurais destas unidades.
Se informado sem unidades '13 10:38:14' será devidamente interpretado '13 days 10 hours 38 minutes 14 seconds'.
CURRENTE_DATE - INTERVAL '1' day;
TO_TIMESTAMP('2006-01-05 17:56:03', 'YYYY-MM-DD HH24:MI:SS')
Tipos Geométricos:
CREATE TABLE geometricos(ponto POINT, segmento LSEG, retangulo BOX, poligono POLYGON, circulo CIRCLE);
ponto (0,0),
segmento de (0,0) até (0,1),
retângulo (base inferior (0,0) até (1,0) e base superior (0,1) até (1,1)) e
círculo com centro em (1,1) e raio 1.
INSERT INTO geometricos VALUES ('(0,0)','((0,0),(0,1))', '((0,0),(0,1))', '((0,0),(0,1),(1,1),(1,0))','((1,1),1)');
Tipos de Dados para Rede:
Para tratar especificamente de redes o PostgreSQL tem os tipos de dados cidr, inet e macaddr.
cidr – para redes IPV4 e IPV6
inet – para redes e hosts IPV4 e IPV6
macaddr – endereços MAC de placas de rede
Assim como tipos data, tipos de rede devem ser preferidos ao invés de usar tipos texto para guardar IPs, Máscaras ou endereços MAC.
Veja um exemplo em Índices Parciais e a documentação oficial para mais detalhes.