Você pode usar funções escalares ODBC ao executar instruções T-SQL no SQL Server. Existem vários tipos de funções escalares ODBC, incluindo funções de string, funções numéricas, funções de sistema e, claro, funções de data/hora (também chamadas de funções de data, hora e intervalo).
Abaixo estão exemplos das funções de data, hora e intervalo que você pode usar no SQL Server.
Sintaxe
Primeiro, aqui está a sintaxe que você precisa usar sempre que chamar uma função escalar ODBC:
SELECT {fn[ ( ,....n) ] }
Onde
<function_name>
é o nome da função e (<argument>,....n)
é qualquer número de argumentos opcionais. Portanto, a principal coisa a lembrar é que quando você chama uma função escalar ODBC, você precisa colocar a chamada de função entre chaves (
{}
) e prefixe o nome com fn
. Exemplo 1 – AGORA()
Esta função retorna a data e a hora atuais como um valor de carimbo de data/hora.
SELECT {fn NOW()} AS Resultado;
Resultado:
+-------------------------+| Resultado ||-------------------------|| 13/06/2018 21:52:25.667 |+-------------------------+
Exemplo 2 – carimbo de data/hora, data e hora
O
CURRENT_TIMESTAMP()
A função retorna a data local atual e a hora local como um valor de carimbo de data/hora. Você também pode usar o CURRENT_DATE()
para retornar apenas a parte da data e/ou CURRENT_TIME()
para retornar apenas a parte do tempo. SELECT {fn CURRENT_TIMESTAMP()} AS 'Data &Hora', {fn CURRENT_DATE()} AS 'Data', {fn CURRENT_TIME()} AS 'Hora';
Resultado:
+--------------+------------+------- -------+| Data e hora | Data | Tempo ||--------------+------------+-------- ------|| 2018-06-13 21:57:29.197 | 13-06-2018 | 21:57:29.197 |+----------------------------+------------+-------- ----------+
Além disso,
CURRENT_TIMESTAMP()
e CURRENT_TIME()
ambos aceitam um argumento opcional para determinar a precisão de segundos do valor retornado. Exemplos:
SELECT {fn CURRENT_TIMESTAMP(3)} AS 'Data e Hora', {fn CURRENT_TIME(6)} AS 'Hora';
Resultado:
+-------------------------+-----------------+| Data e hora | Hora ||-------------------------+-----------------|| 2018-06-13 22:00:59.263 | 22:00:59.263000 |+----------------------------------------+----------------- +
Neste exemplo,
CURRENT_TIMESTAMP()
retorna uma precisão de segundos de 3, enquanto CURRENT_TIME()
retorna uma precisão de segundos de 6. Exemplo 3 – CURDATE() e CURTIME()
Você pode usar
CURDATE()
e/ou CURTIME()
como alternativa às funções de data e hora acima:SELECT {fn CURDATE()} AS 'Data', {fn CURDATE()} AS 'Hora';
Resultado:
+------------+--------------+| Data | Tempo ||------------+--------------|| 13-06-2018 | 22:05:20.013 |+------------+--------------+
Observe que esses argumentos não aceitam argumentos, portanto, se você precisar especificar a precisão de segundos, use
CURRENT_DATE()
e/ou CURRENT_TIME()
em vez de. Exemplo 4 – Dias e Semanas
Existem várias funções escalares ODBC para retornar partes específicas de um valor de data. Essas funções aceitam um argumento, que é a expressão de data da qual extrair a parte de data desejada.
Aqui estão as várias funções para retornar os dias e semanas a partir da data:
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';SELECT {fn DAYNAME(@date)} AS 'DAYNAME', {fn DAYOFYEAR(@date)} AS 'DAYOFYEAR', {fn DAYOFMONTH(@date)} AS 'DAYOFMONTH', {fn DAYOFWEEK(@date)} AS 'DAYOFWEEK', {fn WEEK(@date)} AS 'WEEK';
Resultado:
+-----------+-------------+--------------+----- --------+--------+| DAYNAME | DIADEANO | DIA DE MÊS | DIA DA SEMANA | SEMANA ||-----------+-------------+-----------+------ -------+--------|| segunda-feira | 45 | 14 | 2 | 8 |+-----------+-------------+--------------+------ -------+--------+
Nesse caso, atribuímos uma data a uma variável e passamos essa variável para cada função. A função então retornou a parte de data aplicável.
Exemplo 5 – Meses, Trimestres e Anos
Aqui estão as várias funções para retornar os meses, trimestres e anos a partir do valor de data/hora:
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';SELECT {fn YEAR(@date)} AS 'YEAR', {fn MONTH(@date)} AS 'MONTH', {fn MONTHNAME(@date)} AS 'MONTHNAME', {fn QUARTER(@date)} AS 'QUARTER';
Resultado:
+--------+---------+-------------+-----------+| ANO | MÊS | NOME DO MÊS | QUARTER ||--------+---------+-------------+-----------|| 2000 | 2 | Fevereiro | 1 |+--------+---------+------------+-----------+Exemplo 6 – Horas, Minutos e Segundos
Aqui estão as várias funções para retornar a parte de horas, minutos e segundos do valor de data/hora:
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';SELECT {fn HOUR(@date)} AS 'HOUR', {fn MINUTE(@date)} AS 'MINUTE', {fn SECOND(@date)} AS 'SECOND';
Resultado:
+--------+----------+----------+| HORA | MINUTO | SEGUNDO ||--------+----------+----------|| 7 | 31 | 58 |+--------+----------+----------+Exemplo 7 – A função EXTRACT()
Há também uma função escalar ODBC chamadaEXTRACT()
, que permite extrair as várias partes de data do valor de data/hora. Exemplos abaixo.
Ano, mês e dia
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';SELECT {fn EXTRACT(YEAR FROM @date)} AS 'YEAR', {fn EXTRACT(MONTH FROM @date)} AS 'MONTH ', {fn EXTRACT(DAY FROM @date)} AS 'DAY';
Resultado:
+--------+---------+-----------+| ANO | MÊS | DIA ||--------+---------+-----------|| 2000 | 2 | 14 |+--------+---------+-----------+Horas, minutos e segundos
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';SELECT {fn EXTRACT(HOUR FROM @date)} AS 'HOUR', {fn EXTRACT(MINUTE FROM @date)} AS 'MINUTE ', {fn EXTRACT(SECOND FROM @date)} AS 'SECOND';
Resultado:
+--------+----------+----------+| HORA | MINUTO | SEGUNDO ||--------+----------+----------|| 7 | 31 | 58 |+--------+----------+----------+Exemplo 8 – A função TIMESTAMPADD()
OTIMESTAMPADD()
permite adicionar um número especificado do intervalo especificado (parte de data/hora) ao valor de data/hora. Esta função aceita três argumentos; o intervalo (parte de data/hora) a ser adicionado (por exemplo, mês), o número dessa parte a ser adicionada e o valor da data. Exemplos abaixo.
Ano, Trimestre, Mês e Dia
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';SELECT {fn TIMESTAMPADD(SQL_TSI_YEAR, 21, @date)} AS 'SQL_TSI_YEAR', {fn TIMESTAMPADD(SQL_TSI_QUARTER, 21, @date) } AS 'SQL_TSI_QUARTER', {fn TIMESTAMPADD(SQL_TSI_MONTH, 21, @date)} AS 'SQL_TSI_MONTH', {fn TIMESTAMPADD(SQL_TSI_DAY, 21, @date)} AS 'SQL_TSI_DAY';
Resultado:
SQL_TSI_YEAR | 14/02/2021 07:31:58.1234567SQL_TSI_QUARTER | 2005-05-14 07:31:58.1234567SQL_TSI_MONTH | 2001-11-14 07:31:58.1234567SQL_TSI_DAY | 06-03-2000 07:31:58.1234567Horas, minutos e segundos
DECLARE @date datetime2 ='2000-02-14 07:31:58.1234567';SELECT {fn TIMESTAMPADD(SQL_TSI_HOUR, 5, @date)} AS 'SQL_TSI_HOUR', {fn TIMESTAMPADD(SQL_TSI_MINUTE, 5, @date) } AS 'SQL_TSI_MINUTE', {fn TIMESTAMPADD(SQL_TSI_SECOND, 5, @date)} AS 'SQL_TSI_SECOND', {fn TIMESTAMPADD(SQL_TSI_FRAC_SECOND, 5, @date)} AS 'SQL_TSI_FRAC_SECOND';
Resultado:
SQL_TSI_HOUR | 2000-02-14 12:31:58.1234567SQL_TSI_MINUTE | 2000-02-14 07:36:58.1234567SQL_TSI_SECOND | 2000-02-14 07:32:03.1234567SQL_TSI_FRAC_SECOND | 14-02-2000 07:31:58.1284567Exemplo 9 – A função TIMESTAMPDIFF()
OTIMESTAMPDIFF()
A função retorna a diferença entre dois valores de data/hora. Esta função aceita três argumentos; o intervalo (parte de data/hora) para o qual calcular a diferença (por exemplo, mês), a primeira data e a segunda data. A função retorna o número de intervalos em que a primeira data é maior que a segunda data Exemplos abaixo.
Ano, Trimestre, Mês, Semana e Dia
DECLARE @date1 datetime2 ='2000-02-14 07:31:58.1234567'; DECLARE @date2 datetime2 =DATEADD(year, 1, @date1);SELECT {fn TIMESTAMPDIFF(SQL_TSI_YEAR, @date1, @date2)} AS 'SQL_TSI_YEAR', {fn TIMESTAMPDIFF(SQL_TSI_QUARTER, @date1, @date2)} AS 'SQL_TSI_QUARTER ', {fn TIMESTAMPDIFF(SQL_TSI_MONTH, @date1, @date2)} AS 'SQL_TSI_MONTH', {fn TIMESTAMPDIFF(SQL_TSI_WEEK, @date1, @date2)} AS 'SQL_TSI_WEEK', {fn TIMESTAMPDIFF(SQL_TSI_DAY, @date1, @date2) } AS 'SQL_TSI_DAY';
Resultado:
+----------------+-------------------+--------- --------+----------------+---------------+| SQL_TSI_YEAR | SQL_TSI_QUARTER | SQL_TSI_MONTH | SQL_TSI_WEEK | SQL_TSI_DAY ||----------------+-------------------+---------- -------+----------------+---------------|| 1 | 4 | 12 | 52 | 366 |+----------------+-------------------+---------- -------+----------------+---------------+Horas, minutos e segundos
DECLARE @date1 datetime2 ='2000-02-14 07:31:58.1234567'; DECLARE @date2 datetime2 =DATEADD(day, 1, @date1);SELECT {fn TIMESTAMPDIFF(SQL_TSI_HOUR, @date1, @date2)} AS 'SQL_TSI_HOUR', {fn TIMESTAMPDIFF(SQL_TSI_MINUTE, @date1, @date2)} AS 'SQL_TSI_MINUTE ', {fn TIMESTAMPDIFF(SQL_TSI_SECOND, @date1, @date2)} AS 'SQL_TSI_SECOND', {fn TIMESTAMPDIFF(SQL_TSI_FRAC_SECOND, @date1, @date2)} AS 'SQL_TSI_FRAC_SECOND';
Resultado:
+----------------+------------------+---------- --------+-----------------------+| SQL_TSI_HOUR | SQL_TSI_MINUTE | SQL_TSI_SECOND | SQL_TSI_FRAC_SECOND ||----------------+------------------+----------- -------+-----------------------|| 24 | 1440 | 86400 | 86400000 |+----------------+------------------+----------- -------+-----------------------+