Datas inferior e superior

09/09/2016

0

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.
Laura

Laura

Responder

Post mais votado

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

Priscila Silva

Priscila Silva
Responder

Mais Posts

09/09/2016

Jothaz

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
Responder

10/09/2016

Marcelo Santana

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..


// 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;

Responder

12/09/2016

Laura

Bom dia,
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
Responder

12/09/2016

Fabiano Carvalho

Como está formatada a data e qual o tipo dela?

Basicamente é isso

SELECT *
FROM  [SUA_TABELA]
WHERE DATA BETWEEN DATEADD(DAY,-3,GETDATE()) AND DATEADD(DAY,4,GETDATE())
Responder

12/09/2016

Priscila Silva

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
Responder

12/09/2016

Laura

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


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''''
Responder

12/09/2016

Priscila Silva

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'
Responder

12/09/2016

Laura

Eu estava usando o IF EXISTS, mas estava esquecendo de colocar o que tinha que retornar.

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.
Responder

14/09/2016

Laura

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.


 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




Responder

14/09/2016

Luiz Santos

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



Responder

14/09/2016

Luiz Santos

Laura, sorry.
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

Responder

14/09/2016

Luiz Santos

budbanze, você tem noção que se for dia 1, 2 ou 3 seu código não vai dar certo, né?
Responder

15/09/2016

Laura

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.
Responder

15/09/2016

Luiz Santos

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
Responder

16/09/2016

Laura

Não deu certo Luiz.
Retornou o mesmo dados que anteriormente.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar