- Categorias:
TO_TIMESTAMP / TO_TIMESTAMP_*¶
Converte uma expressão de entrada no carimbo de data/hora correspondente:
TO_TIMESTAMP_LTZ (carimbo de data/hora com fuso horário local)
TO_TIMESTAMP_NTZ (carimbo de data/hora sem fuso horário)
TO_TIMESTAMP_TZ (carimbo de data/hora com fuso horário)
Nota
TO_TIMESTAMP faz o mapeamento para uma das outras funções de carimbo de data/hora, com base no parâmetro de sessão TIMESTAMP_TYPE_MAPPING. O parâmetro padrão é TIMESTAMP_NTZ, de forma que TO_TIMESTAMP faz o mapeamento para TO_TIMESTAMP_NTZ por padrão.
- Consulte também:
TRY_TO_TIMESTAMP / TRY_TO_TIMESTAMP_* ,
Sintaxe¶
timestampFunction ( <numeric_expr> [ , <scale> ] )
timestampFunction ( <date_expr> )
timestampFunction ( <timestamp_expr> )
timestampFunction ( <string_expr> [ , <format> ] )
timestampFunction ( '<integer>' )
timestampFunction ( <variant_expr> )
Onde:
timestampFunction ::= TO_TIMESTAMP | TO_TIMESTAMP_LTZ | TO_TIMESTAMP_NTZ | TO_TIMESTAMP_TZ
Argumentos¶
Obrigatório:
Uma das opções:
numeric_expr
Um número de segundos (se escala = 0 ou está ausente) ou frações de segundo (por exemplo, milissegundos ou nanossegundos) desde o início da época Unix (1970-01-01 00:00:00 UTC). Se uma expressão decimal de números não inteiros for inserida, a escala do resultado é herdada.
date_expr
Uma data a ser convertida em um carimbo de data/hora.
timestamp_expr
Um carimbo de data/hora a ser convertido em outro carimbo de data/hora (por exemplo, conversão de TIMESTAMP_LTZ para TIMESTAMP_NTZ).
string_expr
Uma cadeia de caracteres da qual se pode extrair um carimbo de data/hora, por exemplo,
'2019-01-31 01:02:03.004'
.'integer'
Uma expressão que avalia como uma cadeia de caracteres contendo um número inteiro, por exemplo
'15000000'
. Dependendo da magnitude da cadeia de caracteres, ela pode ser interpretada como segundos, milissegundos, microssegundos ou nanossegundos. Para obter mais detalhes, consulte notas de uso.variant_expr
Uma expressão do tipo VARIANT. O VARIANT deve conter um dos seguintes:
Uma cadeia de caracteres da qual se pode extrair um carimbo de data/hora.
Um carimbo de data/hora.
Um número inteiro que representa o número de segundos, milissegundos, microssegundos ou nanossegundos.
Uma cadeia de caracteres contendo um inteiro que representa o número de segundos, milissegundos, microssegundos ou nanossegundos.
Embora TO_TIMESTAMP aceite um valor DATE, não aceita um DATE dentro de um VARIANT.
Opcional:
format
Especificador do formato (somente para
string_expr
). Para obter mais informações, consulte Formatos de data e hora em funções de conversão.O valor padrão é o valor atual do parâmetro TIMESTAMP_INPUT_FORMAT (padrão AUTO).
scale
Especificador de escala (somente para
numeric_expr
). Se especificado, define a escala dos números fornecidos. Por exemplo:Por segundos, escala =
0
.Para milissegundos, escala =
3
.Para microssegundos, escala =
6
.Para nanossegundos, escala =
9
.
Padrão:
0
Retornos¶
O tipo de dados do valor retornado é um dos tipos de dados de TIMESTAMP. Por padrão, o tipo de dados é TIMESTAMP_NTZ. Você pode alterar isso definindo o parâmetro de sessão TIMESTAMP_TYPE_MAPPING.
Se a entrada for NULL, o resultado será NULL.
Notas de uso¶
Esta família de funções retorna valores de carimbo de data/hora, especificamente:
Para
string_expr
: um carimbo de data/hora representado por uma determinada cadeia de caracteres. Se a cadeia de caracteres não tiver um componente de hora, será usada a meia-noite.Para
date_expr
: um carimbo de data/hora representando a meia-noite de um determinado dia é usado, de acordo com a semântica de mapeamento do carimbo de data/hora específico (NTZ/LTZ/TZ).Para
timestamp_expr
: um carimbo de data/hora com mapeamento possivelmente diferente do carimbo de data/hora de origem.Para
numeric_expr
: um carimbo de data/hora representando o número de segundos (ou frações de segundo) fornecido pelo usuário. A hora UTC é sempre usada para criar o resultado.Para
variant_expr
:Se VARIANT contiver um valor nulo JSON, o resultado será NULL.
Se VARIANT contiver um valor de carimbo de data/hora do mesmo tipo do resultado, este valor será preservado dessa maneira.
Se VARIANT contiver um valor de carimbo de data/hora de tipo diferente, a conversão será feita da mesma maneira que
timestamp_expr
.Se VARIANT contiver uma cadeia de caracteres, a conversão de um valor de cadeia de caracteres será realizada (usando o formato automático).
Se VARIANT contiver um número, a conversão de
numeric_expr
é realizada.Nota
Quando um valor INTEGER é convertido diretamente em TIMESTAMP_NTZ, o número inteiro é tratado como o número de segundos desde o início da época Linux, e o fuso horário local não é levado em conta. No entanto, se o valor INTEGER for armazenado dentro de um valor VARIANT, por exemplo, como mostrado abaixo, então a conversão é indireta e é afetada pelo fuso horário local, mesmo que o resultado final seja TIMESTAMP_NTZ:
SELECT TO_TIMESTAMP(31000000); SELECT TO_TIMESTAMP(PARSE_JSON(31000000)); SELECT PARSE_JSON(31000000)::TIMESTAMP_NTZ;
O carimbo de data/hora retornado pela primeira consulta é diferente da hora retornada pela segunda e terceira consultas.
Para fazer a conversão independentemente do fuso horário local, acrescente uma conversão explícita ao número inteiro na expressão, como mostrado abaixo:
SELECT TO_TIMESTAMP(31000000); SELECT TO_TIMESTAMP(PARSE_JSON(31000000)::INT); SELECT PARSE_JSON(31000000)::INT::TIMESTAMP_NTZ;
O carimbo de data/hora retornado por todas as três consultas é o mesmo. Isso se aplica tanto para converter para TIMESTAMP_NTZ quanto para chamar a função TO_TIMESTAMP_NTZ. Isso também se aplica ao chamar TO_TIMESTAMP quando o parâmetro TIMESTAMP_TYPE_MAPPING é definido como TIMESTAMP_NTZ.
Para um exemplo com saída, consulte os exemplos no final fim tópico.
Se a conversão não for possível, um erro é retornado.
Para carimbos de data/hora com fuso horário, o ajuste do parâmetro TIMEZONE afeta o valor de retorno. O carimbo de data/hora retornado está no fuso horário da sessão.
O formato de exibição dos carimbos de data/hora na saída é determinado pelo formato de saída do registro de data e hora que corresponde à função (TIMESTAMP_OUTPUT_FORMAT, TIMESTAMP_LTZ_OUTPUT_FORMAT, TIMESTAMP_NTZ_OUTPUT_FORMAT ou TIMESTAMP_TZ_OUTPUT_FORMAT).
Se o formato do parâmetro de entrada for uma cadeia de caracteres que contenha um número inteiro:
Depois que a cadeia de caracteres é convertida em um inteiro, o inteiro é tratado como um número de segundos, milissegundos, microssegundos ou nanossegundos após o início da época Unix (1970-01-01 00:00:00.000000000 UTC).
Se o número inteiro for inferior a 31536000000 (o número de milissegundos em um ano), então o valor é tratado como um número de segundos.
Se o valor for maior ou igual a 31536000000 e menor que 31536000000000, então o valor é tratado como milissegundos.
Se o valor for maior ou igual a 31536000000000 e menor que 31536000000000000, então o valor é tratado como microssegundos.
Se o valor for maior ou igual a 31536000000000000, então o valor é tratado como nanossegundos.
Se mais de uma linha for avaliada (por exemplo, se a entrada for o nome da coluna de uma tabela que contém mais de uma linha), cada valor será examinado independentemente para determinar se o valor representa segundos, milissegundos, microssegundos ou nanossegundos.
Quando você usa a função TO_TIMESTAMP_NTZ ou TRY_TO_TIMESTAMP_NTZ para converter um carimbo de data/hora com informações de fuso horário, as informações de fuso horário são perdidas. Se o carimbo de data/hora for então convertido novamente em um carimbo de data/hora com informações de fuso horário (usando a função TO_TIMESTAMP_TZ, por exemplo), as informações de fuso horário não são recuperáveis.
Exemplos¶
Este exemplo mostra que TO_TIMESTAMP_TZ cria um carimbo de data/hora que contém um fuso horário da sessão, mas o valor de TO_TIMESTAMP_NTZ não tem um fuso horário:
ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';
SELECT TO_TIMESTAMP_TZ('2024-04-05 01:02:03');
+----------------------------------------+
| TO_TIMESTAMP_TZ('2024-04-05 01:02:03') |
|----------------------------------------|
| 2024-04-05 01:02:03.000 -0700 |
+----------------------------------------+
SELECT TO_TIMESTAMP_NTZ('2024-04-05 01:02:03');
+-----------------------------------------+
| TO_TIMESTAMP_NTZ('2024-04-05 01:02:03') |
|-----------------------------------------|
| 2024-04-05 01:02:03.000 |
+-----------------------------------------+
Os exemplos a seguir mostram como diferentes formatos podem influenciar a análise de uma data ambígua. Suponha que TIMESTAMP_TZ_OUTPUT_FORMAT não está definido, então TIMESTAMP_OUTPUT_FORMAT é usado e definido como padrão (YYYY-MM-DD HH24:MI:SS.FF3 TZHTZM
).
Este exemplo mostra os resultados quando o formato de entrada é mm/dd/yyyy hh24:mi:ss
(mês/dia/ano):
SELECT TO_TIMESTAMP_TZ('04/05/2024 01:02:03', 'mm/dd/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2024 01:02:03', 'MM/DD/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2024-04-05 01:02:03.000 -0700 |
+-----------------------------------------------------------------+
Este exemplo mostra os resultados quando o formato de entrada é dd/mm/yyyy hh24:mi:ss
(dia/mês/ano):
SELECT TO_TIMESTAMP_TZ('04/05/2024 01:02:03', 'dd/mm/yyyy hh24:mi:ss');
+-----------------------------------------------------------------+
| TO_TIMESTAMP_TZ('04/05/2024 01:02:03', 'DD/MM/YYYY HH24:MI:SS') |
|-----------------------------------------------------------------|
| 2024-05-04 01:02:03.000 -0700 |
+-----------------------------------------------------------------+
Este exemplo mostra como usar uma entrada numérica que representa aproximadamente 40 anos a partir da meia-noite de 1.º de janeiro de 1970 (o início da época Unix): A escala não é especificada, então a escala padrão de 0
(segundos) é usada.
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF9 TZH:TZM';
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400);
+---------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400) |
|---------------------------------------|
| 2010-01-01 00:00:00.000 |
+---------------------------------------+
Este exemplo é semelhante ao exemplo anterior, mas fornece o valor em milissegundos especificando um valor de escala de 3
:
SELECT TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3);
+-------------------------------------------------------+
| TO_TIMESTAMP_NTZ(40 * 365.25 * 86400 * 1000 + 456, 3) |
|-------------------------------------------------------|
| 2010-01-01 00:00:00.456 |
+-------------------------------------------------------+
Este exemplo mostra como os resultados mudam quando diferentes valores de escala são especificados para o mesmo valor numérico:
SELECT TO_TIMESTAMP(1000000000, 0) AS "Scale in seconds",
TO_TIMESTAMP(1000000000, 3) AS "Scale in milliseconds",
TO_TIMESTAMP(1000000000, 6) AS "Scale in microseconds",
TO_TIMESTAMP(1000000000, 9) AS "Scale in nanoseconds";
+-------------------------+-------------------------+-------------------------+-------------------------+
| Scale in seconds | Scale in milliseconds | Scale in microseconds | Scale in nanoseconds |
|-------------------------+-------------------------+-------------------------+-------------------------|
| 2001-09-09 01:46:40.000 | 1970-01-12 13:46:40.000 | 1970-01-01 00:16:40.000 | 1970-01-01 00:00:01.000 |
+-------------------------+-------------------------+-------------------------+-------------------------+
Esse exemplo mostra como a função determina as unidades a serem usadas (segundos, milissegundos, microssegundos ou nanossegundos) quando a entrada é uma cadeia de caracteres que contém um número inteiro, com base na magnitude do valor.
Crie e carregue a tabela com cadeias de caracteres contendo números inteiros dentro de diferentes faixas:
CREATE OR REPLACE TABLE demo1 (
description VARCHAR,
value VARCHAR -- string rather than bigint
);
INSERT INTO demo1 (description, value) VALUES
('Seconds', '31536000'),
('Milliseconds', '31536000000'),
('Microseconds', '31536000000000'),
('Nanoseconds', '31536000000000000');
Passe as cadeias de caracteres para a função:
SELECT description,
value,
TO_TIMESTAMP(value),
TO_DATE(value)
FROM demo1
ORDER BY value;
+--------------+-------------------+-------------------------+----------------+
| DESCRIPTION | VALUE | TO_TIMESTAMP(VALUE) | TO_DATE(VALUE) |
|--------------+-------------------+-------------------------+----------------|
| Seconds | 31536000 | 1971-01-01 00:00:00.000 | 1971-01-01 |
| Milliseconds | 31536000000 | 1971-01-01 00:00:00.000 | 1971-01-01 |
| Microseconds | 31536000000000 | 1971-01-01 00:00:00.000 | 1971-01-01 |
| Nanoseconds | 31536000000000000 | 1971-01-01 00:00:00.000 | 1971-01-01 |
+--------------+-------------------+-------------------------+----------------+
O exemplo a seguir converte valores em TIMESTAMP_NTZ. O exemplo mostra a diferença de comportamento entre o uso de um número inteiro e o uso de uma variante que contém um número inteiro:
SELECT 0::TIMESTAMP_NTZ, PARSE_JSON(0)::TIMESTAMP_NTZ, PARSE_JSON(0)::INT::TIMESTAMP_NTZ;
+-------------------------+------------------------------+-----------------------------------+
| 0::TIMESTAMP_NTZ | PARSE_JSON(0)::TIMESTAMP_NTZ | PARSE_JSON(0)::INT::TIMESTAMP_NTZ |
|-------------------------+------------------------------+-----------------------------------|
| 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000 | 1970-01-01 00:00:00.000 |
+-------------------------+------------------------------+-----------------------------------+
Os carimbos de data/hora retornados correspondem a um inteiro e a uma variante convertida em um inteiro na primeira e terceira colunas, mas o carimbo de data/hora retornado é diferente para a variante que não é convertida em um inteiro na segunda coluna. Para obter mais informações, consulte Notas de uso.
Este mesmo comportamento se aplica ao chamar a função TO_TIMESTAMP_NTZ:
SELECT TO_TIMESTAMP_NTZ(0), TO_TIMESTAMP_NTZ(PARSE_JSON(0)), TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT);
+-------------------------+---------------------------------+--------------------------------------+
| TO_TIMESTAMP_NTZ(0) | TO_TIMESTAMP_NTZ(PARSE_JSON(0)) | TO_TIMESTAMP_NTZ(PARSE_JSON(0)::INT) |
|-------------------------+---------------------------------+--------------------------------------|
| 1970-01-01 00:00:00.000 | 1969-12-31 16:00:00.000 | 1970-01-01 00:00:00.000 |
+-------------------------+---------------------------------+--------------------------------------+