Datas inferior e superior
Oi pessoal, to tendo dificuldade em tratar os dados para retornar os aniversariantes de até 3 dias a menos da data atual e até 4 dias a mais.
Por exemplo,
hoje é dia 09/09
Preciso dos aniversariantes de 06,07,08,09,10,11,12,13/10.
Por exemplo,
hoje é dia 09/09
Preciso dos aniversariantes de 06,07,08,09,10,11,12,13/10.
Laura
Curtidas 0
Melhor post
Priscila Silva
12/09/2016
Tente assim:
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
select nome, dta_nasc from tabela WHERE
month(dta_nasc) = @mes
AND day(dta_nasc) between @dia-3 and @dia+4
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
select nome, dta_nasc from tabela WHERE
month(dta_nasc) = @mes
AND day(dta_nasc) between @dia-3 and @dia+4
GOSTEI 3
Mais Respostas
Jothaz
09/09/2016
Execute o script abaixo para ter um ideia de como fazer.. não tive como testar, mas a ideia é essa.
DECLARE @TAB AS TABLE (DT DATE) --ESTO USANDO A DATA ATUAL -> 2016-09-09 --MAS SERÁ USADA A DATA DO SISTEMA DO DIA QUE VOCÊ RODAR INSERT INTO @TAB (DT) VALUES ((GETDATE() - 10)) INSERT INTO @TAB (DT) VALUES (GETDATE()) INSERT INTO @TAB (DT) VALUES ((GETDATE() - 5)) INSERT INTO @TAB (DT) VALUES ((GETDATE() - 1)) INSERT INTO @TAB (DT) VALUES ((GETDATE() - 2)) INSERT INTO @TAB (DT) VALUES ((GETDATE() + 5)) INSERT INTO @TAB (DT) VALUES ((GETDATE() + 7)) INSERT INTO @TAB (DT) VALUES ((GETDATE() + 4)) INSERT INTO @TAB (DT) VALUES ((GETDATE() + 3)) INSERT INTO @TAB (DT) VALUES ((GETDATE() + 2)) SELECT * FROM @TAB SELECT * FROM @TAB WHERE DT BETWEEN (GETDATE() - 3) AND GETDATE() OR DT BETWEEN GETDATE() AND (GETDATE() + 4) ORDER BY DT
GOSTEI 0
Marcelo Santana
09/09/2016
Boa tarde, Laura.. Se quiser mostrar a tabela do seu banco podemos fazer o exemplo com base nela.. Mas em todo caso, segue uma estrutura basica.. Se seu interesse for somente o select, já vá direto para ultima linha..
Abraço, Marcelo Queiroz..
Abraço, Marcelo Queiroz..
// CREAÇÃO DA TABELA;
CREATE TABLE ANIVERSARIO
(
COD_NIVER INT PRIMARY KEY NOT NULL,
NOME VARCHAR(80) NOT NULL,
NASCIMENTO date NOT NULL
)
GO
//EFETUANDO INSERT
INSERT INTO ANIVERSARIO (COD_NIVER, NOME, NASCIMENTO) VALUES(1, 'Marcelo', (GETDATE() + 1)),(2, 'Alex', (GETDATE() + 2)),(3, 'João',(GETDATE() + 3)),(4, 'Amanda', (GETDATE() + 4)),(5, 'Bruno', (GETDATE() + 5)),(6, 'Marcela', (GETDATE() + 6)),(7, 'Iolanda', (GETDATE() - 1)),(8, 'Candido', (GETDATE() - 2)),(9, 'Josy', (GETDATE() - 3)),(10, 'Elma', (GETDATE() - 4)),(11, 'Edna', (GETDATE() - 5)),(12, 'Wellington', (GETDATE() - 6));
// SELECIONANDO DATAS NO PERÍODO ESTIPULADO ATRAVÉS DO BETWEEN
SELECT * FROM ANIVERSARIO WHERE NASCIMENTO BETWEEN((GETDATE() -3) AND (GETDATE() + 4)) ORDER BY NASCIMENTO;
GOSTEI 0
Laura
09/09/2016
Bom dia,
Do jeito que vocês fizeram, pegararia os aniversariantes do dia, mes e ano atual.
Eu fiz assim:
Mas me retorna, o seguinte erro
Mensagem 206, Nível 16, Estado 2, Linha 1
Operand type clash: int is incompatible with date
Mensagem 402, Nível 16, Estado 1, Linha 3
The data types datetime and date are incompatible in the add operator
Obrigada pela atenção
Do jeito que vocês fizeram, pegararia os aniversariantes do dia, mes e ano atual.
Eu fiz assim:
declare @mes date = month(getdate()) begin select nome, dta_nasc from tabela WHERE dta_nasc BETWEEN dateadd(day,-3,getdate() + @mes) AND dateadd(day,+4,GETDATE() + @mes)
Mas me retorna, o seguinte erro
Mensagem 206, Nível 16, Estado 2, Linha 1
Operand type clash: int is incompatible with date
Mensagem 402, Nível 16, Estado 1, Linha 3
The data types datetime and date are incompatible in the add operator
Obrigada pela atenção
GOSTEI 0
Fabiano Carvalho
09/09/2016
Como está formatada a data e qual o tipo dela?
Basicamente é isso
Basicamente é isso
SELECT * FROM [SUA_TABELA] WHERE DATA BETWEEN DATEADD(DAY,-3,GETDATE()) AND DATEADD(DAY,4,GETDATE())
GOSTEI 0
Priscila Silva
09/09/2016
Tente assim:
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
select nome, dta_nasc from tabela WHERE
month(dta_nasc) = @mes
AND day(dta_nasc) between @dia-3 and @dia+4
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
select nome, dta_nasc from tabela WHERE
month(dta_nasc) = @mes
AND day(dta_nasc) between @dia-3 and @dia+4
GOSTEI 0
Laura
09/09/2016
Tente assim:
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
select nome, dta_nasc from tabela WHERE
month(dta_nasc) = @mes
AND day(dta_nasc) between @dia-3 and @dia+4
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
select nome, dta_nasc from tabela WHERE
month(dta_nasc) = @mes
AND day(dta_nasc) between @dia-3 and @dia+4
Este script deu certo, MUITO OBRIGADA.
Vou abusar um pouquinho, em caso de não haver nenhum aniversariante no mês, como faço para printar uma msg na tela, do tipo ''''NÃO HÁ ANIVERSARIANTES''''
GOSTEI 0
Priscila Silva
09/09/2016
Que bom que conseguiu!
Vê se o "print" atende a sua necessidade:
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
IF EXISTS ( select nome, dta_nasc from tabela WHERE month(dta_nasc) = @mes AND day(dta_nasc) between @dia-3 and @dia+4 )
select nome, dta_nasc from tabela WHERE month(dta_nasc) = @mes AND day(dta_nasc) between @dia-3 and @dia+4
ELSE
PRINT'-Não há aniversáriantes'
Vê se o "print" atende a sua necessidade:
declare @mes as Int
declare @dia as Int
set @mes = month(getdate())
set @dia = day(getdate())
IF EXISTS ( select nome, dta_nasc from tabela WHERE month(dta_nasc) = @mes AND day(dta_nasc) between @dia-3 and @dia+4 )
select nome, dta_nasc from tabela WHERE month(dta_nasc) = @mes AND day(dta_nasc) between @dia-3 and @dia+4
ELSE
PRINT'-Não há aniversáriantes'
GOSTEI 0
Laura
09/09/2016
Eu estava usando o IF EXISTS, mas estava esquecendo de colocar o que tinha que retornar.
Mais uma vez, MUITO OBRIGADA.
declare @mes as Int declare @dia as Int set @mes = month(getdate()) set @dia = day(getdate()) IF EXISTS ( select nome, dta_nasc from [tb_FUNCIONARIOS] WHERE flag = 'A' AND month(dta_nasc) = @mes AND day(dta_nasc) between @dia-3 and @dia+4 ) ELSE PRINT 'Não há aniversariante'
Mais uma vez, MUITO OBRIGADA.
GOSTEI 1
Laura
09/09/2016
Boa tarde gente, voltei com uma duvida.
Tiver que alterar o código, porque casjo não haja aniversariante, o retorno da query não pode ser apenas ''Não há aniversariantes'', tem de aparecer pelo menos 8 aniversariantes, mesmo que sejam inferior ao dia e mes atual.
Fiz a seguinte query, mas não estou conseguindo ordenar por mes.
Tiver que alterar o código, porque casjo não haja aniversariante, o retorno da query não pode ser apenas ''Não há aniversariantes'', tem de aparecer pelo menos 8 aniversariantes, mesmo que sejam inferior ao dia e mes atual.
Fiz a seguinte query, mas não estou conseguindo ordenar por mes.
with data as(
select
replicate(''0'', 2 - len(day(DTA_NASC))) +
convert(varchar, day(DTA_NASC)) +''-'' +
replicate(''0'', 2 - len(month(getdate()))) +
convert(varchar, month(DTA_NASC)) Dia,
Nome,
case
when day(DTA_NASC) = day(dateadd(day, -3, getdate())) and
day(DTA_NASC) = day(dateadd(day,+ 4, getdate())) then 0
end Coluna
from tabela
where
day(Dta_Nasc) >= 1 and day(Dta_Nasc) < = 31 and month(Dta_Nasc) >= month(getdate())
)
select * from data
union all
select top 1
replicate(''0'', 2 - len(day(getdate()))) +
convert(varchar, day(getdate())) +''-'' +
(replicate(''0'', 2 - len(month(getdate())))) +
convert(varchar, month(getdate())),
case
when dia <> (replicate('''', 2 - len(day(getdate()))) + convert(varchar, day(getdate())) +''-'' + convert(varchar, month(getdate()))) then ''Não há aniversariante''
else
Nome
end ,
'' ''
from data
GOSTEI 0
Luiz Santos
09/09/2016
Laura, veja se esse exemplo te atende
CREATE TABLE #ANIVERSARIO(
NOME VARCHAR(100),
DATA DATE
);
INSERT INTO #ANIVERSARIO VALUES('LUIZ','1978-08-28')
INSERT INTO #ANIVERSARIO VALUES('FERNANDO','1978-09-15')
IF EXISTS(SELECT * FROM #ANIVERSARIO
WHERE CONVERT(DATE, CONVERT(VARCHAR(8), YEAR(GETDATE())*10000+MONTH(DATA)*100+DAY(DATA)),112)
BETWEEN GETDATE()-3 AND GETDATE() + 4)
BEGIN
SELECT * FROM #ANIVERSARIO
WHERE CONVERT(DATE, CONVERT(VARCHAR(8), YEAR(GETDATE())*10000+MONTH(DATA)*100+DAY(DATA)),112)
BETWEEN GETDATE()-3 AND GETDATE() + 4
END
ELSE
BEGIN
SELECT TOP 8 *
FROM #ANIVERSARIO
ORDER BY 2 DESC
END
GOSTEI 0
Luiz Santos
09/09/2016
Laura, sorry.
Ficou faltando no ultimo SQL o Where
Ficou faltando no ultimo SQL o Where
SELECT TOP 8 *
FROM #ANIVERSARIO
WHERE CONVERT(DATE, CONVERT(VARCHAR(8), YEAR(GETDATE())*10000+MONTH(DATA)*100+DAY(DATA)),112) < GETDATE()
ORDER BY 2 DESC
GOSTEI 0
Luiz Santos
09/09/2016
budbanze, você tem noção que se for dia 1, 2 ou 3 seu código não vai dar certo, né?
GOSTEI 0
Laura
09/09/2016
OLá Luiz,
rodei seu script e só me retornou um dado, que é um aniversariante da data de ontem.
Preciso que mostre pelo menos 8 aniversariantes, mesmo que sejam de datas futuras, e não havendo na data atual, retornar a mensagem.
rodei seu script e só me retornou um dado, que é um aniversariante da data de ontem.
Preciso que mostre pelo menos 8 aniversariantes, mesmo que sejam de datas futuras, e não havendo na data atual, retornar a mensagem.
GOSTEI 0
Luiz Santos
09/09/2016
Bom dia Laura.
Tinha entendido que eram os 8 últimos não os próximos 8.
Nesse caso, mude o sinal do segundo select de menor(<) para maior (>) e o Order By para ASC em vez de DESC.
Assim ele vai trazer os próximos 8, desde que não haja nenhum aniversariante no período de 7 dias.
Grande abraço
Tinha entendido que eram os 8 últimos não os próximos 8.
Nesse caso, mude o sinal do segundo select de menor(<) para maior (>) e o Order By para ASC em vez de DESC.
Assim ele vai trazer os próximos 8, desde que não haja nenhum aniversariante no período de 7 dias.
Grande abraço
GOSTEI 0
Laura
09/09/2016
Não deu certo Luiz.
Retornou o mesmo dados que anteriormente.
Retornou o mesmo dados que anteriormente.
GOSTEI 0
Luiz Santos
09/09/2016
Fiz uma pequena alteração.
Para testar, mude as datas no insert.
Para testar, mude as datas no insert.
IF OBJECT_ID(N'TEMPDB..#ANIVERSARIO') IS NOT NULL
DROP TABLE #ANIVERSARIO
CREATE TABLE #ANIVERSARIO(
NOME VARCHAR(100),
DATA DATE
);
INSERT INTO #ANIVERSARIO
VALUES('A','1978-08-28'),
('B','1978-09-25'),
('C','1978-10-28'),
('D','1978-11-15'),
('E','1978-12-28'),
('F','1978-01-15'),
('G','1978-02-28'),
('H','1978-03-15'),
('I','1978-04-28'),
('J','1978-05-15'),
('K','1978-06-28'),
('L','1978-07-15');
IF EXISTS(SELECT * FROM #ANIVERSARIO
WHERE CONVERT(DATE, CONVERT(VARCHAR(8), YEAR(GETDATE())*10000+MONTH(DATA)*100+DAY(DATA)),112)
BETWEEN GETDATE()-3 AND GETDATE() + 4)
BEGIN
SELECT * FROM #ANIVERSARIO
WHERE CONVERT(DATE, CONVERT(VARCHAR(8), YEAR(GETDATE())*10000+MONTH(DATA)*100+DAY(DATA)),112)
BETWEEN GETDATE()-3 AND GETDATE() + 4
END
ELSE
BEGIN
SELECT TOP 8 *
FROM #ANIVERSARIO
ORDER BY 2 ASC
END
GOSTEI 0