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 entre 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’;
Encerramento
Neste artigo você viu várias formas de trabalhar com datas no SQL.
Para quem trabalha como datas, é comum existir a necessidade de trabalhar com horas.
No artigo a seguir eu mostro como isso pode ser feito no SQL