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írgula com o nome do fuso horário, abreviatura, deslocamento do UTC e indicador se o fuso horário segue 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 Antarctica/South Pole
, abreviatura NZDT
, com deslocamento 13:00:00
do UTC e f
para indicar que segue o horário de verão. A segunda linha é o fuso horário Europe/Paris
, abreviatura CET
, com deslocamento 01:00:00
do UTC e f
para indicar que não segue o horário de verão.
pg_timezone_names
------------------
(Antarctica/South_Pole,NZDT,13:00:00,t)
(Europe/Paris,CET,01: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 abreviatura do fuso horário, o deslocamento do UTC e o indicador que informa se o fuso horário segue 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 abreviatura de Pacific Daylight Time, PDT
, com um deslocamento de -07:00:00
do UTC e t
para indicar que segue o horário de verão. A segunda linha contém a abreviatura de Pacific Standard Time, PST
, com um deslocamento de -08:00:00
do UTC e f
para indicar que não segue 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 abreviatura 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)