Os métodos de formatação do PostgreSQL incluem uma coleção útil de ferramentas para traduzir diferentes tipos de dados (data / hora, inteiro, ponto flutuante, numérico) para strings formatadas e converter strings formatadas de volta para tipos de dados únicos. Doravante, às vezes precisamos converter os fusos horários também. O tempo é sempre registrado em UTC em carimbos de data / hora PostgreSQL para o formulário de dados de fuso horário, mas é exibido por padrão no navegador, sessão ou hora local do usuário. Uma de suas funções auxiliares nas quais confiamos é o método TO_CHAR (), que permite carimbos de data / hora com fuso horário, entre outras formas, e permite que você organize as partes de um carimbo de data / hora como quiser. Um carimbo de data / hora, uma precisão dupla, a duração, um número ou um valor numérico podem ser convertidos em uma string usando o método PostgreSQL TO_CHAR (). Parece haver um método de argumento único, 'to_timestamp', que recebe um argumento de precisão dupla e se transforma de época Unix em carimbo de data / hora usando o fuso horário. Mostraremos como fazer algo sobre isso nesta postagem. Vamos dar uma olhada em to_char () primeiro.
Sintaxe:
A sintaxe geral para a função to_char () é a seguinte:
>> To_char (expressão, formato);O método TO_CHAR () no PostgreSQL precisa de duas afirmações:
- Expressão: Um carimbo de data / hora, uma duração, um número, uma precisão dupla ou um valor numérico que é traduzido para uma string de acordo com um formato específico podem ser usados como expressões.
- Formato: O estilo em que a string de saída será mostrada. O formato pode ser diferente de acordo com o tipo de expressão, e.g., numero, data.
Existem dois tipos de carimbo de data / hora disponíveis no PostgreSQL:
- Timestamp: sem fuso horário.
- Timestamptz: com fuso horário.
E aqui está o problema: o formulário de dados de carimbo de data / hora padrão ignora os fusos horários. E é uma necessidade SQL (como isso poderia ter ocorrido parece além). Nosso foco principal é aprender to_Char () timestamp com um fuso horário. Para começar a trabalhar no PostgreSQL com a função 'to_char ()', abra o shell de linha de comando do PostgreSQL e forneça os valores de parâmetro para o servidor obrigatório, banco de dados, número da porta, nome de usuário e senha. Deixe essas considerações por preencher se precisar consumir os parâmetros designados padrão, conforme mostrado na imagem abaixo.
To_char () para número de string
Para entender o conceito da função to_Char () usando carimbo de data / hora com fuso horário, você deve primeiro tentar o exemplo de números de string. Portanto, temos um número '1897' e iremos convertê-lo para '9999.Formato 99 'usando a consulta abaixo. Na saída abaixo, você pode ver que o número da string foi convertido para o formato especificado.
>> SELECIONE to_char (1897, '9999.99 ');
Aqui está outra ilustração para conversão. Desta vez, convertemos um número em um formato diferente com 'vírgula' nele. O caractere 'G' será usado para especificar uma vírgula.
>> SELECIONE to_char (367.78, '9G999.99 ');
To_char Timestamp com TimeZone
Para entender o conceito de carimbo de data / hora com fuso horário, vamos considerar um exemplo simples. Suponha que você esteja no 'Paquistão', então seu fuso horário deve ser 'PKT' agora.
Exemplo 01:
Vamos tentar buscar o carimbo de data / hora atual na consulta SELECT ao convertê-lo para o formato de data e hora, conforme mostrado na consulta abaixo. O termo 'TZ' é usado para devolver o fuso horário atual. A saída exibe o dia, data, hora e fuso horário.
>> SELECT to_char (CURRENT_TIMESTAMP, 'Dia Seg dd, aaaa HH12: MI AM (TZ)');
Vamos mudar nosso fuso horário para 'Europa / Roma'.
>> SET TimeZone = 'Europa / Roma';
Você obterá uma hora, data e fuso horário diferentes ao tentar a mesma consulta SELECT, conforme mostrado.
Exemplo 02:
Quando você especifica o fuso horário na consulta SELECT, a saída não mostrará o fuso horário atual conforme a saída abaixo.
>> SELECIONE to_char (CURRENT_TIMESTAMP NO FUSO HORÁRIO 'Ásia / Jerusalém', 'aaaa HH12: MI AM (TZ)');
Exemplo 03:
Vamos criar uma tabela rápida chamada 'time' com dois campos. Um é do tipo TIMESTAMP e o outro é do tipo TIMESTAMPTZ.
>> CREATE TABLE time (without_timezone TIMESTAMP, with_timezone TIMESTAMPTZ);
Agora vamos verificar o fuso horário atual que estamos usando em nosso sistema usando o comando SHOW no shell da seguinte maneira:
>> MOSTRAR fuso horário;
Agora você deve inserir os valores atuais da data e hora do fuso horário atual que você está usando no seu dispositivo na tabela 'hora' usando a função 'agora ()' conforme mostrado abaixo.
>> INSERT INTO time VALUES (now (), now ());
Agora você pode buscar o registro da tabela 'tempo' usando a consulta SELECT como abaixo. A coluna 'without_timezone' mostra a data e hora atuais sem um fuso horário, enquanto a coluna 'with_timezone' mostra a hora local com o fuso horário completamente.
>> SELECIONE * DA hora;
Vamos alterar o fuso horário para 'US / EASTERN' na consulta abaixo.
>> DEFINIR FUSO HORÁRIO 'EUA / ORIENTE';
Agora vamos verificar a tabela novamente. Você verá como o valor da coluna 'with_timezone' foi exibido de acordo com o fuso horário 'US / EASTERN', mas o valor de 'without_timezone' é o mesmo de antes.
>> SELECIONE * DA hora;
Exemplo 04:
Vamos ter mais alguns exemplos para o método to_char (). Assuma o mesmo 'tempo' da tabela acima. Estaremos convertendo o valor da coluna 'without_timezone' em uma string composta de horas, minutos, segundos e fuso horário. Vamos tentar a consulta SELECT usando o método to_char () para converter o valor da coluna 'without_timezone'. Mencionamos 'TZ' em nossa consulta, mas ele não mostrará o fuso horário porque o valor da coluna não consiste no fuso horário. O comando abaixo indicado fornece a saída:
>> SELECT to_char (without_timezone, 'HH12: MI: SS TZ') FROM time;
Agora vamos tentar a mesma consulta no caso da outra coluna 'with_timezone', para convertê-la para a string de horas, minutos, segundos e fuso horário. Desta vez, ele irá mostrar o fuso horário com o tempo também usando a consulta abaixo.
>> SELECIONE to_char (with_timezone, 'HH12: MI: SS TZ') FROM time;
Conclusão:
Visto que o problema com / sem fuso horário afeta mais do que apenas o particionamento de tabela, eu recomendo que você use o tipo de fuso horário sempre que possível. Quase todas as diretrizes discutidas sobre como fazer a purga dependente do tempo no PostgreSQL usando o horário local. Uma solução adequada, sensível ao fuso horário, adiciona poucas complicações, mas pode salvá-lo de problemas no futuro.