Trabalhando com datas no SQL

 

Neste artigo vamos ver como trabalhar com datas utiilzando SQL. Os exemplos a seguir serão nos bancos de dados SQL Server e MySQL.

 

Para retornar a data e hora atual você pode utilizar CURRENT_TIMESTAMP

 

SELECT CURRENT_TIMESTAMP as data_atual;

 

No SQL Server, você pode utilizar a função GETDATE().

 

SELECT GETDATE() as data_atual;

 

Para retornar a data no formato dd/mm/aaaa será necessário usar a função CONVERT para converter uma informação no formato DATE ou DATETIME numa string com o formato de data desejada.

 

SELECT 

CONVERT(varchar(10), getdate(), 103)

 

 

Para os dois bancos de dados, as funções YEAR, MONTH e DAY permitem filtrar de forma fácil campos do tipo DATE ou DATETIME.

YEAR - Permite filtrar por ano.

MONTH - Permite filtrar por mês.

DAY - Permite filtrar por dia.

 

YEAR()

SELECT coluna1, coluna2

FROM nome_da_tabela

WHERE YEAR(coluna_data) = valor

 

MONTH()

SELECT coluna1, coluna2

FROM nome_da_tabela

WHERE MONTH(coluna_data) = valor

 

DAY()

SELECT coluna1, coluna2

FROM nome_da_tabela

WHERE DAY(coluna_data) = valor

 

Para praticar, vamos criar uma tabela e carregar com alguns dados para testes.

 

MySQL

CREATE TABLE funcionarios (

    codigo INT NOT NULL AUTO_INCREMENT,

    nome VARCHAR (255),

    email VARCHAR (255),

    telefone VARCHAR (255),

    cidade VARCHAR (255),

    departamento VARCHAR (255),

    salario NUMERIC (10,2),

    data_admissao DATE

);

 

SQL Server

CREATE TABLE funcionarios (

    codigo IDENTITY(1,1) PRIMARY KEY,

    nome VARCHAR (255),

    email VARCHAR (255),

    telefone VARCHAR (255),

    cidade VARCHAR (255),

    departamento VARCHAR (255),

    salario NUMERIC (10,2),

    data_admissao DATE

);

 

 

Os dados que vamos utilizar são os seguintes:

 

INSERT INTO funcionarios (nome, email, telefone, cidade, departamento, salario, data_admissao) VALUES ('Fulano da Silva', 'fulano@teste.com.br', '(11) 1234-5678','SAO PAULO', 'TI', 2517.23, '2020-01-15');

INSERT INTO funcionarios (nome, email, telefone, cidade, departamento, salario, data_admissao) VALUES ('Beltrano Santos', 'beltrano@teste.com.br', '(11) 1234-5678','JUNDIAI', 'MARKETING', 1817.15, '2020-07-15');

INSERT INTO funcionarios (nome, email, telefone, cidade, departamento, salario, data_admissao) VALUES ('Siclano Souza', 'siclano@teste.com.br', '(11) 1234-5678','DIADEMA', 'TI', 3700.15, '2020-05-15');

INSERT INTO funcionarios (nome, email, telefone, cidade, departamento, salario, data_admissao) VALUES ('Euripedes Silva', 'euripedes@teste.com.br', '(11) 1234-5678','SANTOS', 'MARKETING', 1200.15, '2020-03-18');

INSERT INTO funcionarios (nome, email, telefone, cidade, departamento, salario, data_admissao) VALUES ('Xerxes Santos', 'xerxes@teste.com.br', '(11) 1234-5678','SAO PAULO', 'TI', 4200.00, '2019-11-19');

INSERT INTO funcionarios (nome, email, telefone, cidade, departamento, salario, data_admissao) VALUES ( 'Trajano Souza','trajano@teste.com.br', '(11) 1234-5678','CAMPINAS', 'COMERCIAL', 5000.00, '2019-12-02');

 

Agora que já inserimos informações, vamos trabalhar com as opções de filtragem por data.

 

Para filtrar um intervalo de datas, você pode utilizar o BETWEEN. Exemplo:

SELECT * FROM funcionarios 

WHERE data_admissao 

BETWEEN '2020-01-01' AND '2020-01-31';

 

No exemplo acima, a data foi informada no formato americano (ano-mês-dia). Utilizando as funções de data, podemos chegar no mesmo resultado desta forma:

 

SELECT * FROM funcionarios 

WHERE YEAR(data_admissao) = 2020 

AND MONTH(data_admissao) = 1;

 

Se for necessário filtrar vários meses dentro do mesmo ano, podemos usar o operador "IN".

 

SELECT * FROM funcionarios 

WHERE year(data_admissao) = 2020 

AND

MONTH(data_admissao) in (1,2,3,4,5);

 

Para listar os funcionários que foram admitidos num determinado dia, podemos utilizar a função DAY

 

SELECT * FROM funcionarios 

WHERE DAY(data_admissao) = 18;

 

Estas funções também podem ser utilizadas como parte dos resultados. No exemplo a seguir, vamos retornar o nome dos funcionários e o dia, mês e ano em campos separados.

 

SELECT nome,

DAY(data_admissao) as dia,

MONTH(data_admissao) as mes,

YEAR(data_admissao) as ano

FROM funcionarios 

 

Para calcular a diferença de duas datas, podemos utilizar a função DATEDIFF. Vamos ver um exemplo de como utilizar no SQL Server.

 

SELECT 

DATEDIFF (intervalo, data_inicial, data_final) 

FROM minha_tabela;

 

O retorno desta função é o indicador que foi definido como intervalo entre as datas informadas

 

As opções de intervalo são as seguintes:

Year- ano

Quarter,- quadrimestre

Month - mês

Dayofyear – dia do ano

Day – dia.

Week – semana.

Weekday – dia da semana.

Hour - hora

Minute - minuto

Second - segundos

 

O retorno desta função sempre será um número inteiro.

 

No exemplo a seguir, vamos calcular a diferença de dias entre o primeiro e o último funcionário contratado do departamento de TI.

 

Para fazer isso, vamos precisar pegar a primeira e a última data deste departamento, isso pode ser obtido utilizando respectivamente as funções de agregação MIN e MAX

 

SELECT 

DATEDIFF (day, MIN(data_admissao), MAX(data_admissao)) as diferenca_dias

FROM funcionários

WHERE departamento = ‘TI’;

 

 

No MySQL também existe uma função DATEDIFF, mas o seu comportamento é diferente.

 

SELECT 

DATEDIFF (data_final, data_inicial) 

FROM minha_tabela;

 

O retorno desta função vai ser o número de dias entre as datas informadas

 

No exemplo a seguir, vamos calcular a diferença de dias entre o primeiro e o último funcionário contratado do departamento de TI. Para fazer isso, vamos seguir o mesmo exemplo que foi utilizado no SQL Server.

 

SELECT 

DATEDIFF (MAX(data_admissao), MIN(data_admissao)) as diferenca_dias

FROM funcionários

WHERE departamento = ‘TI’;

 

 

Quer conferir mais dicas sobre banco de dados? Clique aqui e veja mais dicas!
BINS - Blog SQL

 

Conteúdo sobre banco de dados sem complicação!

MySQL - Referência Rápida

 

SQL Server - Referência Rápida

 

SQL vs Mongo

 

 

 

Veja outros conteúdos que podem ser de seu interesse