Função CONVERT_TIMEZONE - Amazon Redshift

Função CONVERT_TIMEZONE

CONVERT_TIMEZONE converte um timestamp de um fuso horário para outro. A função se ajusta automaticamente para o horário de verão.

Sintaxe

CONVERT_TIMEZONE( ['source_timezone',] 'target_timezone', 'timestamp')

Argumentos

source_timezone

(Opcional) O fuso horário do timestamp atual. O padrão é UTC. Para ter mais informações, consulte Observações quanto ao uso de fuso horário.

target_timezone

O fuso horário do novo timestamp. Para ter mais informações, consulte Observações quanto ao uso de fuso horário.

timestamp

Uma coluna de timestamp ou uma expressão que converta implicitamente para um timestamp.

Tipo de retorno

TIMESTAMP

Observações quanto ao uso de fuso horário

source_timezone ou target_timezone pode ser especificado como o nome do fuso horário (tal como “África/Kampala” ou “Singapura”) ou como uma abreviatura de fuso horário (tal como “UTC” ou “PDT”). Você não precisa converter nomes de fuso horário em nomes ou abreviaturas em abreviaturas. Por exemplo, você pode escolher um carimbo de data e hora do nome de fuso horário de origem “Singapura” e convertê-lo em um carimbo de data e hora na abreviatura de fuso horário “PDT”.

nota

Os resultados da utilização de um nome de fuso horário ou de uma abreviatura de fuso horário podem ser diferentes devido ao horário sazonal local, como o horário de verão.

Usar um nome de fuso horário

Para visualizar uma lista completa e atualizada de nomes de fuso horário, execute o comando a seguir.

select pg_timezone_names();

Cada linha contém uma string separada por vírgulas com o nome do fuso horário, a abreviação, o deslocamento em relação a UTC e o indicador que informa se o fuso horário acompanha o horário de verão (t ou f). Por exemplo, o trecho a seguir mostra duas linhas resultantes. A primeira linha é o fuso horário Europe/Paris, abreviatura CET, com deslocamento 01:00:00 do UTC e f para indicar que ele não observa o horário de verão. A segunda linha é o fuso horário Israel, abreviatura IST, com deslocamento 02:00:00 do UTC e f para indicar que ele não observa o horário de verão.

pg_timezone_names ----------------- (Europe/Paris,CET,01:00:00,f) (Israel,IST,02:00:00,f)

Execute a instrução SQL para obter a lista inteira e encontrar um nome de fuso horário. Aproximadamente 600 linhas são retornadas. Embora alguns dos nomes de fuso horário retornados sejam iniciais em maiúsculas ou acrônimos (por exemplo, GB, PRC, ROK), a função CONVERT_TIMEZONE os trata como nomes de fuso horário, e não abreviações.

Se você especificar um fuso horário usando um nome de fuso horário, CONVERT_TIMEZONE fará o ajuste automático para o horário de verão (DST) ou qualquer outro protocolo sazonal local, tal como horário de verão, horário padrão ou horário de inverno, que esteja em vigor durante a data e hora especificadas pelo “carimbo de data/hora”. Por exemplo, “Europa/Londres” representa UTC no inverno e adiciona uma hora no verão.

Usar uma abreviação de fuso horário

Para visualizar uma lista completa e atualizada de abreviaturas de fuso horário, execute o comando a seguir.

select pg_timezone_abbrevs();

Os resultados contêm uma string separada por vírgulas com a abreviação do fuso horário, o deslocamento em relação a UTC e o indicador que informa se o fuso horário acompanha o horário de verão (t ou f). Por exemplo, o trecho a seguir mostra duas linhas resultantes. A primeira linha contém a abreviação de Pacific Daylight Time PDT, com um deslocamento de -07:00:00 em relação a UTC e t para indicar que acompanha o horário de verão. A segunda linha contém a abreviatura do horário padrão do Pacífico, PST, com um deslocamento de -08:00:00 em relação ao UTC e f para indicar que ele não observa o horário de verão.

pg_timezone_abbrevs -------------------- (PDT,-07:00:00,t) (PST,-08:00:00,f)

Execute a instrução SQL para obter a lista completa e encontrar uma abreviação com base em seu deslocamento e indicador de horário de verão. Aproximadamente 200 linhas são retornadas.

As abreviações de fuso horário representam um deslocamento fixo do UTC. Se você especificar um fuso horário usando uma abreviatura de fuso horário, CONVERT_TIMEZONE usará o deslocamento fixo do UTC e não fará o ajuste para nenhum protocolo sazonal local.

Usar o formato de estilo POSIX

Uma especificação de fuso horário no estilo POSIX tem o formato STDoffset ou STDoffsetDST, em que STD é uma abreviatura de fuso horário, offset é o desvio numérico em horas a oeste de UTC e DST é uma abreviatura opcional de fuso horário de verão. Supõe-se que o horário de verão seja uma hora a mais que o deslocamento fornecido.

Os formatos de fuso horário estilo POSIX usam deslocamentos positivos à Oeste de Greenwich, em contraste com a convenção ISO-8601, usando deslocamentos positivos à Leste de Greenwich.

A seguir, exemplos de fusos horários no estilo POSIX:

  • PST8

  • PST8PDT

  • EST5

  • EST5EDT

nota

O Amazon Redshift não valida especificações de fuso horário no estilo POSIX, portanto é possível definir o fuso horário com um valor inválido. Por exemplo, o seguinte comando não retorna um erro, mesmo que ele defina o fuso horário com um valor inválido.

set timezone to ‘xxx36’;

Exemplos

Muitos dos exemplos usam a amostra de conjunto de dados TICKIT. Para obter mais informações, consulte Banco de dados de amostra.

O exemplo a seguir converte o valor de carimbo de data/hora do fuso horário UTC padrão em PST.

select convert_timezone('PST', '2008-08-21 07:23:54'); convert_timezone ------------------------ 2008-08-20 23:23:54

O exemplo a seguir converte o valor do timestamp na coluna LISTTIME do fuso horário UTC padrão para PST. Embora o timestamp esteja no período de horário de verão, ele é convertido para o horário padrão, pois o fuso horário de destino é especificado como uma abreviação (PST).

select listtime, convert_timezone('PST', listtime) from listing where listid = 16; listtime | convert_timezone --------------------+------------------- 2008-08-24 09:36:12 2008-08-24 01:36:12

O seguinte exemplo converte uma coluna de fuso horário LISTTIME do fuso horário UTC padrão para o fuso horário EUA/Pacífico. A fuso horário de destino usa um nome de fuso horário e o timestamp está no horário de verão, portanto a função retorna o horário de verão.

select listtime, convert_timezone('US/Pacific', listtime) from listing where listid = 16; listtime | convert_timezone --------------------+--------------------- 2008-08-24 09:36:12 | 2008-08-24 02:36:12

O exemplo a seguir converte uma string de timestamp de EST para PST:

select convert_timezone('EST', 'PST', '20080305 12:25:29'); convert_timezone ------------------- 2008-03-05 09:25:29

O exemplo a seguir converte um timestamp para o horário padrão do Leste dos EUA, pois o fuso horário de destino usa um nome de fuso horário (America/New_York) e o timestamp está dentro do período de horário padrão.

select convert_timezone('America/New_York', '2013-02-01 08:00:00'); convert_timezone --------------------- 2013-02-01 03:00:00 (1 row)

O seguinte exemplo converte o timestamp para o horário de verão do Leste dos EUA, pois o fuso horário de destino usa um nome de fuso horário (America/New_York) e o timestamp está dentro do período do horário de verão.

select convert_timezone('America/New_York', '2013-06-01 08:00:00'); convert_timezone --------------------- 2013-06-01 04:00:00 (1 row)

O seguinte exemplo demonstra o uso de deslocamentos.

SELECT CONVERT_TIMEZONE('GMT','NEWZONE +2','2014-05-17 12:00:00') as newzone_plus_2, CONVERT_TIMEZONE('GMT','NEWZONE-2:15','2014-05-17 12:00:00') as newzone_minus_2_15, CONVERT_TIMEZONE('GMT','America/Los_Angeles+2','2014-05-17 12:00:00') as la_plus_2, CONVERT_TIMEZONE('GMT','GMT+2','2014-05-17 12:00:00') as gmt_plus_2; newzone_plus_2 | newzone_minus_2_15 | la_plus_2 | gmt_plus_2 ---------------------+---------------------+---------------------+--------------------- 2014-05-17 10:00:00 | 2014-05-17 14:15:00 | 2014-05-17 10:00:00 | 2014-05-17 10:00:00 (1 row)