Funções de data e hora¶
Esta família de funções pode ser usada para construir, converter, extrair ou modificar dados de data, hora e carimbo de data/hora.
Neste tópico:
Lista de funções¶
| Subcategoria | Função | Notas | 
|---|---|---|
| Construção | ||
| Extração | Aceita todas as partes de data e hora (consulte Partes de data e hora com suporte). | |
| Alternativa para DATE_PART. | ||
| Alternativa para DATE_PART. | ||
| Aceita partes de data relevantes (consulte Partes de data e hora com suporte). | ||
| Alternativa para DATE_PART. | ||
| Adição/subtração | ||
| Aceita partes relevantes de data e hora (consulte Partes de data e hora com suporte). | ||
| Aceita partes relevantes de data e hora (consulte Partes de data e hora com suporte). | ||
| Alias para DATEADD. | ||
| Alias para DATEDIFF. | ||
| Alias para DATEADD. | ||
| Alias para DATEDIFF. | ||
| Truncamento** | Aceita partes relevantes de data e hora (consulte Partes de data e hora com suporte). | |
| Permite que a hora seja “arredondada” até o início de um intervalo de tempo igualmente espaçado. | ||
| Alternativa para DATE_TRUNC. | ||
| Conversão | Oferece suporte a conversões baseadas em cadeia de caracteres, carimbo de data/hora e expressões VARIANT. Oferece suporte a números inteiros para conversões baseadas no início da época Unix. | |
| Oferece suporte a conversões baseadas em cadeia de caracteres, carimbo de data/hora e expressões VARIANT. Oferece suporte a números inteiros para conversões baseadas no início da época Unix. | ||
| Oferece suporte a conversões baseadas em cadeia de caracteres, data, carimbo de data/hora e expressões VARIANT. Oferece suporte a expressões numéricas e inteiros para conversões baseadas no início da época Unix. | ||
| Fuso horário | ||
| Alertas* | ||
Formatos de saída¶
Várias funções de data e hora retornam valores de data, hora e carimbo de data/hora. Os seguintes parâmetros de sessão determinam o formato da saída retornada por essas funções:
- O formato de exibição dos horários é determinado pelo parâmetro de sessão TIME_OUTPUT_FORMAT (padrão - HH24:MI:SS).
- O formato de exibição das datas é determinado pelo parâmetro de sessão DATE_OUTPUT_FORMAT (padrão - YYYY-MM-DD).
- O formato de exibição dos carimbos de data/hora é determinado pelo tipo de dados do carimbo de data/hora retornado pela função. Os seguintes parâmetros de sessão definem o formato de saída para diferentes tipos de dados de carimbo de data/hora: 
Para obter mais informações, consulte Formatos de entrada e saída de data e hora.
Partes de data e hora com suporte¶
Algumas funções (assim como aliases e alternativas apropriadas) aceitam como argumento uma parte da data ou hora. As duas tabelas a seguir listam as partes (sem distinção entre maiúsculas e minúsculas) que você pode usar com essas funções.
| Partes de data | Abreviações/variações | DATEADD | DATEDIFF | DATE_PART | DATE_TRUNC | LAST_DAY | 
|---|---|---|---|---|---|---|
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | ✔ | 
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | ✔ | 
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | |
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | ✔ | 
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | ✔ | 
| 
 | ✔ | |||||
| 
 | ✔ | 
[1] Para detalhes de uso, consulte a próxima seção, que descreve como o Snowflake trata semanas do calendário e dias úteis.
[2] Não controlado pelos parâmetros de sessão WEEK_START e WEEK_OF_YEAR_POLICY, conforme descrito na próxima seção.
| Partes de hora | Abreviações/Variações | DATEADD | DATEDIFF | DATE_PART | DATE_TRUNC | LAST_DAY | 
|---|---|---|---|---|---|---|
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | |
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | |
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | |
| 
 | 
 | ✔ | ✔ | ✔ | ||
| 
 | 
 | ✔ | ✔ | ✔ | ||
| 
 | 
 | ✔ | ✔ | ✔ | ✔ | |
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | ||||
| 
 | 
 | ✔ | 
Semanas do ano e dias úteis¶
O comportamento das funções relacionadas à semana no Snowflake é controlado pelos parâmetros de sessão WEEK_START e WEEK_OF_YEAR_POLICY. Um aspecto importante para entender como esses parâmetros interagem é o conceito de semanas ISO.
Semanas ISO¶
Como definido na norma ISO 8601 (para formatos de datas e horas), as semanas ISO sempre começam na segunda-feira e “pertencem” ao ano que contém a quinta-feira daquela semana. Isto significa que um dia em um ano pode pertencer a uma semana em um ano diferente:
- Para dias no início de janeiro, o valor WOY (semana do ano) pode ser 52 ou 53 (ou seja, o dia pertence à última semana do ano anterior). 
- Para dias no final de dezembro, o valor WOY pode ser 1 (ou seja, o dia pertence à primeira semana do ano seguinte). 
O Snowflake fornece um conjunto especial de funções de data relacionadas à semana (e partes de dados equivalentes) cujo comportamento é consistente com a semântica da semana ISO: DAYOFWEEKISO, WEEKISO e YEAROFWEEKISO.
Essas funções (e partes de datas) desconsideram os parâmetros de sessão (ou seja, sempre seguem a semântica ISO).
Para obter detalhes sobre como as outras funções de data relacionadas à semana são manipuladas, consulte as seguintes seções:
Primeiro dia da semana¶
A maioria das funções relacionadas à semana são controladas apenas pelo parâmetro de sessão WEEK_START. Os resultados da função diferem dependendo de como este parâmetro é definido:
| Função | Parâmetro definido como  | Parâmetro definir como  | 
|---|---|---|
| Retorna  | Retorna  | |
| DATE_TRUNC (com uma parte  | Trunca a semana de entrada para começar na segunda-feira. | Trunca a semana de entrada para começar no primeiro dia definido da semana. | 
| LAST_DAY (com uma parte  | Retorna o domingo da semana de entrada. | Retorna o último dia da semana de entrada em relação ao primeiro dia definido da semana. | 
| DATEDIFF (com uma parte  | Calculado usando semanas que começam na segunda-feira. | Calculado usando semanas que começam no primeiro dia definido da semana. | 
Dica
O valor padrão para o parâmetro é 0, que preserva o comportamento legado do Snowflake (semântica ISO). No entanto, recomendamos alterar esse valor para controlar explicitamente o comportamento resultante das funções. O cenário mais comum é definir o parâmetro como 1.
Primeira e última semana do ano¶
O parâmetro de sessão WEEK_OF_YEAR_POLICY controla como as funções WEEK e YEAROFWEEK se comportam. O parâmetro pode ter dois valores:
- 0: as funções afetadas relacionadas à semana usam uma semântica semelhante à semântica ISO, na qual uma semana pertence a um determinado ano se pelo menos 4 dias dessa semana estiverem nesse ano. Isto significa que todas as semanas têm 7 dias, mas os primeiros dias de janeiro e os últimos dias de dezembro podem pertencer a uma semana em um ano diferente. Por isso, as funções YEAROFWEEK e YEAROFWEEKISO podem fornecer o ano ao qual a semana pertence.
- 1: 1º de janeiro sempre inicia a primeira semana do ano e 31 de dezembro está sempre na última semana do ano. Isso significa que a primeira e a última semana do ano podem ter menos de 7 dias.
Esse comportamento também é influenciado pelo dia de início da semana, conforme controlado pelo valor definido para o parâmetro de sessão WEEK_START:
- 0ou- 1: O comportamento é equivalente à semântica da semana ISO, com a semana começando na segunda-feira.
- 2a- 7: a lógica de “4 dias” é mantida, mas o primeiro dia da semana é diferente.
Dica
O valor padrão para ambos os parâmetros é 0, o que preserva o comportamento legado do Snowflake (semântica ISO). No entanto, recomendamos alterar esses valores para controlar explicitamente o comportamento resultante das funções. O cenário mais comum é definir ambos os parâmetros como 1.
Exemplos¶
Estes exemplos consultam o mesmo conjunto de funções de data, mas com valores diferentes definidos para os parâmetros de sessão WEEK_OF_YEAR_POLICY e WEEK_START para ilustrar como eles influenciam os resultados das funções.
Os exemplos usam os seguintes dados:
CREATE OR REPLACE TABLE week_examples (d DATE);
INSERT INTO week_examples VALUES
  ('2016-12-30'),
  ('2016-12-31'),
  ('2017-01-01'),
  ('2017-01-02'),
  ('2017-01-03'),
  ('2017-01-04'),
  ('2017-01-05'),
  ('2017-12-30'),
  ('2017-12-31');
Controle do primeiro dia da semana¶
A configuração WEEK_START como 0 (comportamento herdado) ou 1 (segunda-feira) não tem um efeito significativo, como ilustrado nos dois exemplos a seguir:
ALTER SESSION SET WEEK_START = 0;
SELECT d "Date",
       DAYNAME(d) "Day",
       DAYOFWEEK(d) "DOW",
       DATE_TRUNC('week', d) "Trunc Date",
       DAYNAME("Trunc Date") "Trunc Day",
       LAST_DAY(d, 'week') "Last DOW Date",
       DAYNAME("Last DOW Date") "Last DOW Day",
       DATEDIFF('week', '2017-01-01', d) "Weeks Diff from 2017-01-01 to Date"
  FROM week_examples;
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
| Date       | Day | DOW | Trunc Date | Trunc Day | Last DOW Date | Last DOW Day | Weeks Diff from 2017-01-01 to Date |
|------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------|
| 2016-12-30 | Fri |   5 | 2016-12-26 | Mon       | 2017-01-01    | Sun          |                                  0 |
| 2016-12-31 | Sat |   6 | 2016-12-26 | Mon       | 2017-01-01    | Sun          |                                  0 |
| 2017-01-01 | Sun |   0 | 2016-12-26 | Mon       | 2017-01-01    | Sun          |                                  0 |
| 2017-01-02 | Mon |   1 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-01-03 | Tue |   2 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-01-04 | Wed |   3 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-01-05 | Thu |   4 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-12-30 | Sat |   6 | 2017-12-25 | Mon       | 2017-12-31    | Sun          |                                 52 |
| 2017-12-31 | Sun |   0 | 2017-12-25 | Mon       | 2017-12-31    | Sun          |                                 52 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
ALTER SESSION SET WEEK_START = 1;
SELECT d "Date",
       DAYNAME(d) "Day",
       DAYOFWEEK(d) "DOW",
       DATE_TRUNC('week', d) "Trunc Date",
       DAYNAME("Trunc Date") "Trunc Day",
       LAST_DAY(d, 'week') "Last DOW Date",
       DAYNAME("Last DOW Date") "Last DOW Day",
       DATEDIFF('week', '2017-01-01', d) "Weeks Diff from 2017-01-01 to Date"
  FROM week_examples;
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
| Date       | Day | DOW | Trunc Date | Trunc Day | Last DOW Date | Last DOW Day | Weeks Diff from 2017-01-01 to Date |
|------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------|
| 2016-12-30 | Fri |   5 | 2016-12-26 | Mon       | 2017-01-01    | Sun          |                                  0 |
| 2016-12-31 | Sat |   6 | 2016-12-26 | Mon       | 2017-01-01    | Sun          |                                  0 |
| 2017-01-01 | Sun |   7 | 2016-12-26 | Mon       | 2017-01-01    | Sun          |                                  0 |
| 2017-01-02 | Mon |   1 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-01-03 | Tue |   2 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-01-04 | Wed |   3 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-01-05 | Thu |   4 | 2017-01-02 | Mon       | 2017-01-08    | Sun          |                                  1 |
| 2017-12-30 | Sat |   6 | 2017-12-25 | Mon       | 2017-12-31    | Sun          |                                 52 |
| 2017-12-31 | Sun |   7 | 2017-12-25 | Mon       | 2017-12-31    | Sun          |                                 52 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
- Com WEEK_START definido como - 0, o DOW para domingo é- 0.
- Com WEEK_START definido como - 1, o DOW para domingo é- 7.
Os resultados diferem mais significativamente se WEEK_START for definido como qualquer dia que não seja segunda-feira. Por exemplo, definir o parâmetro para 3 (quarta-feira) altera os resultados de todas as funções relacionadas à semana (colunas 3 a 8):
ALTER SESSION SET WEEK_START = 3;
SELECT d "Date",
       DAYNAME(d) "Day",
       DAYOFWEEK(d) "DOW",
       DATE_TRUNC('week', d) "Trunc Date",
       DAYNAME("Trunc Date") "Trunc Day",
       LAST_DAY(d, 'week') "Last DOW Date",
       DAYNAME("Last DOW Date") "Last DOW Day",
       DATEDIFF('week', '2017-01-01', d) "Weeks Diff from 2017-01-01 to Date"
  FROM week_examples;
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
| Date       | Day | DOW | Trunc Date | Trunc Day | Last DOW Date | Last DOW Day | Weeks Diff from 2017-01-01 to Date |
|------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------|
| 2016-12-30 | Fri |   3 | 2016-12-28 | Wed       | 2017-01-03    | Tue          |                                  0 |
| 2016-12-31 | Sat |   4 | 2016-12-28 | Wed       | 2017-01-03    | Tue          |                                  0 |
| 2017-01-01 | Sun |   5 | 2016-12-28 | Wed       | 2017-01-03    | Tue          |                                  0 |
| 2017-01-02 | Mon |   6 | 2016-12-28 | Wed       | 2017-01-03    | Tue          |                                  0 |
| 2017-01-03 | Tue |   7 | 2016-12-28 | Wed       | 2017-01-03    | Tue          |                                  0 |
| 2017-01-04 | Wed |   1 | 2017-01-04 | Wed       | 2017-01-10    | Tue          |                                  1 |
| 2017-01-05 | Thu |   2 | 2017-01-04 | Wed       | 2017-01-10    | Tue          |                                  1 |
| 2017-12-30 | Sat |   4 | 2017-12-27 | Wed       | 2018-01-02    | Tue          |                                 52 |
| 2017-12-31 | Sun |   5 | 2017-12-27 | Wed       | 2018-01-02    | Tue          |                                 52 |
+------------+-----+-----+------------+-----------+---------------+--------------+------------------------------------+
Controle do ano e dos dias para as primeiras/últimas semanas do ano¶
O exemplo a seguir define ambos os parâmetros como 0 para seguir a semântica similar ao ISO (ou seja, a semana começa na segunda-feira e todas as semanas têm 7 dias):
ALTER SESSION SET WEEK_OF_YEAR_POLICY=0, WEEK_START=0;
SELECT d "Date",
       DAYNAME(d) "Day",
       WEEK(d) "WOY",
       WEEKISO(d) "WOY (ISO)",
       YEAROFWEEK(d) "YOW",
       YEAROFWEEKISO(d) "YOW (ISO)"
  FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date       | Day | WOY | WOY (ISO) |  YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri |  52 |        52 | 2016 |      2016 |
| 2016-12-31 | Sat |  52 |        52 | 2016 |      2016 |
| 2017-01-01 | Sun |  52 |        52 | 2016 |      2016 |
| 2017-01-02 | Mon |   1 |         1 | 2017 |      2017 |
| 2017-01-03 | Tue |   1 |         1 | 2017 |      2017 |
| 2017-01-04 | Wed |   1 |         1 | 2017 |      2017 |
| 2017-01-05 | Thu |   1 |         1 | 2017 |      2017 |
| 2017-12-30 | Sat |  52 |        52 | 2017 |      2017 |
| 2017-12-31 | Sun |  52 |        52 | 2017 |      2017 |
+------------+-----+-----+-----------+------+-----------+
O próximo exemplo ilustra o efeito de manter WEEK_OF_YEAR_POLICY como 0, mas mudar WEEK_START para 3 (quarta-feira):
ALTER SESSION SET WEEK_OF_YEAR_POLICY=0, WEEK_START=3;
SELECT d "Date",
       DAYNAME(d) "Day",
       WEEK(d) "WOY",
       WEEKISO(d) "WOY (ISO)",
       YEAROFWEEK(d) "YOW",
       YEAROFWEEKISO(d) "YOW (ISO)"
  FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date       | Day | WOY | WOY (ISO) |  YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri |  53 |        52 | 2016 |      2016 |
| 2016-12-31 | Sat |  53 |        52 | 2016 |      2016 |
| 2017-01-01 | Sun |  53 |        52 | 2016 |      2016 |
| 2017-01-02 | Mon |  53 |         1 | 2016 |      2017 |
| 2017-01-03 | Tue |  53 |         1 | 2016 |      2017 |
| 2017-01-04 | Wed |   1 |         1 | 2017 |      2017 |
| 2017-01-05 | Thu |   1 |         1 | 2017 |      2017 |
| 2017-12-30 | Sat |  52 |        52 | 2017 |      2017 |
| 2017-12-31 | Sun |  52 |        52 | 2017 |      2017 |
+------------+-----+-----+-----------+------+-----------+
- 2016 agora tem 53 semanas (em vez de 52). 
- WOY como 1.º de jan, 2017 passa para a semana 53 (de 52). 
- WOY como 2 e 3 de jan, 2017 passa para a semana 53 (de 1). 
- YOW como 2 e 3 de jan, 2017 passa para 2016 (de 2017). 
- WOY (ISO) e YOW (ISO) não são afetados pela mudança de parâmetro. 
Os dois últimos exemplos definem WEEK_OF_YEAR_POLICY como 1 e definem WEEK_START primeiro como 1 (segunda-feira) e depois como 3 (quarta-feira):
ALTER SESSION SET WEEK_OF_YEAR_POLICY=1, WEEK_START=1;
SELECT d "Date",
       DAYNAME(d) "Day",
       WEEK(d) "WOY",
       WEEKISO(d) "WOY (ISO)",
       YEAROFWEEK(d) "YOW",
       YEAROFWEEKISO(d) "YOW (ISO)"
  FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date       | Day | WOY | WOY (ISO) |  YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri |  53 |        52 | 2016 |      2016 |
| 2016-12-31 | Sat |  53 |        52 | 2016 |      2016 |
| 2017-01-01 | Sun |   1 |        52 | 2017 |      2016 |
| 2017-01-02 | Mon |   2 |         1 | 2017 |      2017 |
| 2017-01-03 | Tue |   2 |         1 | 2017 |      2017 |
| 2017-01-04 | Wed |   2 |         1 | 2017 |      2017 |
| 2017-01-05 | Thu |   2 |         1 | 2017 |      2017 |
| 2017-12-30 | Sat |  53 |        52 | 2017 |      2017 |
| 2017-12-31 | Sun |  53 |        52 | 2017 |      2017 |
+------------+-----+-----+-----------+------+-----------+
ALTER SESSION SET week_of_year_policy=1, week_start=3;
SELECT d "Date",
       DAYNAME(d) "Day",
       WEEK(d) "WOY",
       WEEKISO(d) "WOY (ISO)",
       YEAROFWEEK(d) "YOW",
       YEAROFWEEKISO(d) "YOW (ISO)"
  FROM week_examples;
+------------+-----+-----+-----------+------+-----------+
| Date       | Day | WOY | WOY (ISO) |  YOW | YOW (ISO) |
|------------+-----+-----+-----------+------+-----------|
| 2016-12-30 | Fri |  53 |        52 | 2016 |      2016 |
| 2016-12-31 | Sat |  53 |        52 | 2016 |      2016 |
| 2017-01-01 | Sun |   1 |        52 | 2017 |      2016 |
| 2017-01-02 | Mon |   1 |         1 | 2017 |      2017 |
| 2017-01-03 | Tue |   1 |         1 | 2017 |      2017 |
| 2017-01-04 | Wed |   2 |         1 | 2017 |      2017 |
| 2017-01-05 | Thu |   2 |         1 | 2017 |      2017 |
| 2017-12-30 | Sat |  53 |        52 | 2017 |      2017 |
| 2017-12-31 | Sun |  53 |        52 | 2017 |      2017 |
+------------+-----+-----+-----------+------+-----------+
- Com WEEK_OF_YEAR_POLICY definida como - 1e WEEK_START definido como- 1(segunda-feira):- WOY para - 2017-01-01é- 1.
- A semana 1 consiste em 1 dia. 
- A semana 2 começa na - Mon.
 - Esse cenário de uso geralmente é o mais comum. 
- Com WEEK_OF_YEAR_POLICY definida como - 1e WEEK_START definido como- 3(quarta-feira):- WOY para 2017-01-01 ainda é - 1.
- A semana 1 consiste em 3 dias. 
- A semana 2 começa na - Wed.
 
Em ambos os exemplos, WOY (ISO) e YOW (ISO) não são afetados pela mudança de parâmetro.