Introdução
Neste laboratório, você explorará as poderosas operações de data e hora do PostgreSQL. Você aprenderá a trabalhar com timestamps que incluem informações de fuso horário, uma habilidade crucial para aplicações que lidam com dados de diferentes localizações geográficas.
Você começará criando uma tabela projetada para armazenar dados de eventos, utilizando o tipo de dado TIMESTAMPTZ para garantir a consciência do fuso horário. Em seguida, você inserirá dados para eventos que ocorrem em diferentes fusos horários e aprenderá como o PostgreSQL normaliza esses dados. Finalmente, você praticará a consulta e manipulação desses dados temporais usando funções como EXTRACT, a cláusula AT TIME ZONE e o cálculo de diferenças de tempo com INTERVAL.
Criar uma Tabela para Eventos Baseados em Tempo
Nesta etapa, você se conectará ao banco de dados PostgreSQL e criará uma tabela para armazenar informações de eventos. Esta tabela usará o tipo de dado TIMESTAMPTZ, que é essencial para armazenar com precisão timestamps de vários fusos horários.
Compreendendo TIMESTAMPTZ
O tipo de dado TIMESTAMPTZ (timestamp com fuso horário) no PostgreSQL foi projetado para lidar com datas e horas de todo o mundo. Ao inserir um valor com um fuso horário específico, o PostgreSQL o converte para o Tempo Universal Coordenado (UTC) para armazenamento. Essa padronização facilita a comparação e o cálculo de horários, independentemente de seu fuso horário original.
Etapa 1: Conectar ao PostgreSQL
Primeiro, abra um terminal. Conecte-se ao banco de dados PostgreSQL usando o shell interativo psql. Você executará todos os comandos SQL subsequentes neste shell.
sudo -u postgres psql
Agora você verá o prompt do PostgreSQL, que se parece com postgres=#.
Etapa 2: Criar a Tabela events
Agora, execute o seguinte comando SQL para criar a tabela events. Esta tabela armazenará um ID, um nome e um horário para cada evento.
CREATE TABLE events (
id SERIAL PRIMARY KEY,
event_name VARCHAR(255),
event_time TIMESTAMPTZ
);
Este comando cria uma tabela chamada events com três colunas:
id: Uma chave primária auto-incrementável.event_name: Um campo de texto para o nome do evento.event_time: Um timestamp com suporte a fuso horário.
Etapa 3: Verificar a Criação da Tabela
Para confirmar que a tabela foi criada corretamente, você pode inspecionar sua estrutura com o comando \d.
\d events
Você deverá ver o esquema da tabela events, confirmando suas colunas e tipos de dados.
Table "public.events"
Column | Type | Collation | Nullable | Default
------------+------------------------+-----------+----------+-----------------------------------
id | integer | | not null | nextval('events_id_seq'::regclass)
event_name | character varying(255) | | |
event_time | timestamp with time zone | | |
Indexes:
"events_pkey" PRIMARY KEY, btree (id)
Você configurou com sucesso a tabela para armazenar dados baseados em tempo.
Inserir Dados com Informações de Fuso Horário
Nesta etapa, você inserirá registros na tabela events. Cada registro terá um timestamp associado a um fuso horário específico, demonstrando como o PostgreSQL lida com dados de diferentes localizações geográficas.
Etapa 1: Inserir Dados de Eventos
Enquanto estiver no shell psql, execute as seguintes instruções INSERT para adicionar três eventos à sua tabela. Observe como cada event_time inclui um identificador de fuso horário.
Insira uma conferência de Los Angeles (UTC-8):
INSERT INTO events (event_name, event_time) VALUES
('Conference Call', '2024-01-20 10:00:00 America/Los_Angeles');
Insira uma reunião de projeto de Londres (UTC+0):
INSERT INTO events (event_name, event_time) VALUES
('Project Meeting', '2024-01-20 18:00:00 Europe/London');
Insira uma reunião de acompanhamento, também de Los Angeles:
INSERT INTO events (event_name, event_time) VALUES
('Follow-up Meeting', '2024-01-21 12:00:00 America/Los_Angeles');
Etapa 2: Verificar a Inserção de Dados
Para ver como o PostgreSQL armazenou esses dados, consulte a tabela events.
SELECT * FROM events;
Você deverá ver a seguinte saída.
id | event_name | event_time
----+-------------------+------------------------
1 | Conference Call | 2024-01-20 18:00:00+00
2 | Project Meeting | 2024-01-20 18:00:00+00
3 | Follow-up Meeting | 2024-01-21 20:00:00+00
(3 rows)
Observe que todos os valores de event_time são exibidos em UTC (indicado pelo deslocamento +00). Por exemplo, 10:00:00 em Los Angeles (UTC-8) foi convertido para 18:00:00 UTC. Essa conversão interna é o que permite comparações consistentes baseadas em tempo.
Consultar e Formatar Timestamps
Agora que você tem dados armazenados em UTC, pode consultá-los e exibi-los em qualquer fuso horário que precisar. Nesta etapa, você usará a função EXTRACT e a cláusula AT TIME ZONE para manipular e formatar seus timestamps.
Etapa 1: Extrair Partes de um Timestamp com EXTRACT
A função EXTRACT permite extrair componentes específicos (como ano, mês, hora) de um timestamp. Vamos obter o ano de cada evento.
SELECT event_name, EXTRACT(YEAR FROM event_time) AS event_year FROM events;
A consulta extrai o ano do timestamp UTC armazenado.
event_name | event_year
-------------------+------------
Conference Call | 2024
Project Meeting | 2024
Follow-up Meeting | 2024
(3 rows)
Etapa 2: Converter Timestamps com AT TIME ZONE
Para visualizar o horário UTC armazenado em um fuso horário local específico, use a cláusula AT TIME ZONE. Vamos converter todos os horários de eventos de volta para o fuso horário America/Los_Angeles.
SELECT event_name, event_time AT TIME ZONE 'America/Los_Angeles' AS los_angeles_time FROM events;
Esta consulta pega o event_time UTC e exibe seu horário local equivalente em Los Angeles.
event_name | los_angeles_time
-------------------+---------------------
Conference Call | 2024-01-20 10:00:00
Project Meeting | 2024-01-20 10:00:00
Follow-up Meeting | 2024-01-21 12:00:00
(3 rows)
Como você pode ver, a 'Project Meeting', que ocorreu às 18:00:00 UTC, é corretamente exibida como 10:00:00 no horário de Los Angeles.
Etapa 3: Combinar EXTRACT e AT TIME ZONE
Você pode combinar esses recursos para consultas mais poderosas. Por exemplo, para encontrar a hora de cada evento como ocorreu no fuso horário Europe/London:
SELECT event_name, EXTRACT(HOUR FROM event_time AT TIME ZONE 'Europe/London') AS event_hour_london FROM events;
Esta consulta primeiro converte o horário para o fuso horário de Londres e, em seguida, extrai a hora.
event_name | event_hour_london
-------------------+-------------------
Conference Call | 18
Project Meeting | 18
Follow-up Meeting | 20
(3 rows)
Calcular Diferenças de Tempo
Um requisito comum é calcular a duração entre dois eventos. No PostgreSQL, subtrair um timestamp de outro resulta em um tipo de dado INTERVAL, que representa uma duração de tempo.
Etapa 1: Calcular a Diferença Entre Dois Eventos
Vamos encontrar o tempo decorrido entre a 'Conference Call' e a 'Follow-up Meeting'. Podemos conseguir isso unindo a tabela events a si mesma.
SELECT
e1.event_name AS event1,
e2.event_name AS event2,
e2.event_time - e1.event_time AS time_difference
FROM
events e1
JOIN
events e2 ON e1.event_name = 'Conference Call' AND e2.event_name = 'Follow-up Meeting';
Esta consulta funciona da seguinte forma:
- Cria duas instâncias virtuais da tabela
events,e1ee2. - Filtra
e1para conter apenas a linha 'Conference Call'. - Filtra
e2para conter apenas a linha 'Follow-up Meeting'. - Subtrai o
event_timedee1do dee2.
O resultado é um valor do tipo INTERVAL.
event1 | event2 | time_difference
-----------------+-------------------+-----------------
Conference Call | Follow-up Meeting | 1 day 02:00:00
(1 row)
A diferença de tempo é de 1 dia e 2 horas.
Etapa 2: Extrair Componentes de um INTERVAL
Você também pode usar EXTRACT em um INTERVAL para obter partes específicas da duração, como o número de dias ou horas. Vamos extrair apenas o número de dias do cálculo anterior.
SELECT
EXTRACT(DAY FROM (e2.event_time - e1.event_time)) AS days_difference
FROM
events e1
JOIN
events e2 ON e1.event_name = 'Conference Call' AND e2.event_name = 'Follow-up Meeting';
Isso lhe dará um valor numérico para os dias.
days_difference
-----------------
1
(1 row)
Etapa 3: Sair do PostgreSQL
Você completou os exercícios para este laboratório. Agora você pode sair do shell psql e retornar ao terminal principal.
\q
Resumo
Neste laboratório, você explorou operações essenciais de data e hora no PostgreSQL. Você aprendeu a:
- Criar uma tabela usando o tipo de dado
TIMESTAMPTZpara armazenar corretamente informações cientes de fuso horário. - Inserir timestamps com fusos horários especificados e observar como o PostgreSQL os converte para UTC para armazenamento.
- Usar a função
EXTRACTpara recuperar componentes específicos como o ano ou a hora de um timestamp. - Usar a cláusula
AT TIME ZONEpara exibir horários UTC armazenados em qualquer fuso horário local desejado. - Calcular a duração entre dois eventos, que resulta em um
INTERVAL, e extrair componentes desse intervalo.
Essas habilidades são fundamentais para construir aplicações robustas que gerenciam dados temporais com precisão em diferentes regiões.


