
Neste artigo, exploraremos as datas do Postgres, os diferentes tipos de dados de data, usos e funções.
Os carimbos de data e hora são úteis para análise de dados e armazenamento de dados para verificar quando um evento realmente ocorreu. Por exemplo, quando você tem pedidos de compra e venda, ganhos mensais ou trimestrais e muito mais. Os formatos de data variam entre os países, portanto, pode ser uma tarefa complicada para quem não conhece o gerenciamento de banco de dados e trabalha com colunas de data. O formato ou tipo de dados da coluna de data deve sempre corresponder à entrada do usuário. Além disso, você deve converter a exibição do formato de data de acordo com os requisitos do usuário.
O Postgres tem uma variedade de tipos de dados suportados. Antes de prosseguir, sugiro que você consulte Explorando os vários tipos de dados do Postgres para entendê-los com mais detalhes.
Tipo de dados Postgres DATE
O Postgres usa o tipo de dados DATE para armazenar datas diferentes no formato AAAA-MM-DD. Ele usa 4 bytes para armazenar um valor de data em uma coluna.
- Data mais baixa:4713 aC
- Data mais alta:5874897 aC
- Formato de data:AAAA-MM-DD (Ex. 2021-01-01)
Você pode criar uma tabela Postgres com uma coluna DATE e usar a palavra-chave DEFAULT CURRENT_DATE para usar a data atual do sistema como o valor padrão nesta coluna.
CREATE TABLE SalesOrders ( Order_id serial PRIMARY KEY, Orderdetails VARCHAR (255) NOT NULL, OrderDate DATE NOT NULL DEFAULT CURRENT_DATE ); INSERT INTO SalesOrders (Orderdetails) VALUES('Sample Order for customer ABC'); SELECT * FROM SalesOrders;
Conforme mostrado abaixo, o SQL insere um valor para a coluna [OrderDate] automaticamente com a data atual do sistema no formato AAAA-MM-DD.

Funções Postgres DATE
Muitas vezes precisamos modificar o formato da data ou fazer cálculos em valores existentes armazenados na tabela Postgres. Por exemplo, na Índia, o formato de data usual é DD-MM-AAAA. Portanto, quando um usuário indiano visualiza os dados, provavelmente queremos que ele visualize os dados no formato com o qual está mais familiarizado. Nesse caso, o SQL Functions desempenha um papel vital.
função TO_CHAR()
Esta função é útil para fornecer a saída de um valor de data Postgres em um formato especificado. Ele aceita os dois parâmetros a seguir.
- Data de entrada:esta é a data que você deseja converter em um formato específico.
- Formato de data:é aqui que você especifica o novo formato de data.
A consulta a seguir converte os valores de data existentes armazenados na tabela [SalesOrders] no formato DD-MM-AAAA.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As NewDateFormat FROM SalesOrders;

Os valores suportados na função to_char() são mostrados abaixo.
AAAA | Ano em quatro dígitos |
AAAA | Últimos três dígitos de um ano |
AA | Últimos dois dígitos de um ano |
MÊS | Nome do mês em letras maiúsculas |
Mês | Nome do mês com a primeira letra maiúscula |
mês | Nome do mês em letras minúsculas |
SEG/Seg/Seg | Abreviação do mês em letras maiúsculas, primeira letra maiúscula e todas as letras minúsculas, respectivamente |
MM | Número do mês (01-12) |
DIA/Dia/dia | Nome do dia em letras maiúsculas, primeira letra maiúscula e todas as letras minúsculas, respectivamente |
DDD | Dia do ano (001 a 366) |
DD | Dia do mês (01 a 31) |
D | Dia da semana (domingo (1) a sábado (7)) |
L | Semana do mês |
WW | Semana do ano |
Alguns exemplos de formatos de data diferentes são especificados no SQL a seguir.
SELECT Orderdetails,OrderDate as ExistingDateformat, to_char(OrderDate,'DD-MM-YYYY') As DDMMYYYY, to_char(OrderDate,'DD-MM-YY') As DDMMYY, to_char(OrderDate,'DD.MM.YY') As "DD.MM.YY", to_char(OrderDate,'MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DAY MM/DD/YYYY') As "MM/DD/YYYY", to_char(OrderDate,'DDD MM/DD/YYYY') As "DDD MM/DD/YYYY" FROM SalesOrders

função Now()
A função Now() retorna o timestamp atual do sistema (data e hora).

Você pode especificar dois pontos duplos (::) para converter um valor DATETIME em um valor DATE.

Você pode combinar TO_CHAR() e a função Now() para converter o timestamp atual no formato especificado.
SELECT TO_CHAR(NOW() :: DATE, 'dd-mm-yyyy');

Operador de menos e intervalo
Você pode usar o operador menos (-) para calcular a diferença entre duas datas. Por exemplo, a consulta abaixo retorna o intervalo entre o timestamp atual e [Orderdate] da tabela SalesOrders.
SELECT Orderdate,now() as currentdate, now()-Orderdate as Interval FROM SalesOrders where order_id=2;

Você também pode especificar um intervalo para retornar a data após um período especificado. Por exemplo, a consulta SQL abaixo fornece os seguintes valores.
- Para data futura, especifique o valor do intervalo 2 horas a partir do carimbo de data/hora atual: now() + intervalo '2 horas'
- Para data futura, especifique o valor do intervalo de 1 dia a partir do carimbo de data/hora atual: now() + intervalo '1 dia'
- Para datas anteriores, especifique o valor do intervalo um ano a partir do carimbo de data/hora atual: Now() – intervalo "1 ano"
- Calcule um ano após a data a partir do valor armazenado na coluna [Orderdate]: orderdate – intervalo '1 ano'
SELECT (NOW() + interval '2 hour') AS twohourslater, (NOW() + interval '1 day') AS Onedaylater, (NOW() - interval '1 year') AS OneYearBefore, (Orderdate- interval '1 year') as Orderdatedifference from salesorders;

função AGE()
A função AGE() retorna a diferença de data em anos, meses e dias. Você pode usar esta função para calcular a idade de uma pessoa.
Esta função aceita dois parâmetros de data e subtrai o primeiro valor de data do segundo.

Se você reverter os valores no script de função acima, ele retornará o valor negativo.

Em outro exemplo, digamos que alguém tenha uma data de nascimento de 1990-07-01. Portanto, a idade de uma pessoa pode ser calculada como abaixo.
SELECT current_date, AGE(timestamp '1990-07-01') as EmpAge;

função EXTRACT()
A função Extract() retorna o dia, semana, mês, ano e trimestre do valor de data especificado.
Extrair um ano
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-06-28 10:30:15') as year;

Extrair um mês
SELECT EXTRACT(Month FROM TIMESTAMP '2021-06-28 10:30:15') as Month;

Extrair um quarto
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2021-06-28 10:30:15') as QUARTER;

Extrair o dia da semana
SELECT EXTRACT(DOW FROM TIMESTAMP '2021-06-28 10:30:15') as DOW ;

Extrair o dia do ano
SELECT EXTRACT(DOY FROM TIMESTAMP '2021-06-28 10:30:15') as DOY ;

Você também pode usar a função EXTRACT() em combinação com um INTERVAL. Por exemplo, abaixo especificamos o intervalo como 7 anos 9 meses 20 dias 09 horas 12 minutos e 13 segundos. A função de extração retorna os valores individuais.
SELECT EXTRACT(YEAR FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Month FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Day FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(hour FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ), EXTRACT(Minute FROM INTERVAL '7 years 9 months 20 days 09 hours 12 minutes 13 second' ); ;

NO FUSO HORÁRIO
Às vezes, você precisa converter o carimbo de data/hora em um fuso horário diferente. Por exemplo, você pode armazenar valores de data em UTC (coordenador de horário universal) e converter o fuso horário conforme necessário.
SELECT * FROM pg_timezone_names;

Para verificar o fuso horário atual, use SHOW TIMEZONE conforme mostrado abaixo.

Você pode escolher o valor de fuso horário necessário em pg_timezone_names e usar AT TIME ZONE para obter a saída de acordo com o fuso horário especificado.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/Chicago';

Da mesma forma, podemos obter saídas de fuso horário diferentes usando AT TIME ZONE.
SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'America/New_York';

SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Asia/Qatar';

SELECT '2021-06-28 07:09:19'::timestamp AT TIME ZONE 'Europe/Istanbul';

Resumo
Os tipos de data Postgres são essenciais e valiosos ao armazenar datas e carimbos de data/hora em quase todas as tabelas de um banco de dados relacional. Você precisa deles para várias finalidades, como inserção de pedidos ou ao atualizar timestamp, pedidos de compra e venda, detalhes de eventos, informações de clientes e funcionários e muito mais. Você pode usar várias funções do Postgres para converter um tipo de data para o fuso horário necessário, formato e informações específicas para simplificar a extração e análise de seus dados.