Jump to content

ciclo com While + contador


jafm
 Share

Recommended Posts

Boas,

Tenho um ciclo while com um contador, que atualmente ele conta os dias do mês

WHILE @Contador <= @NumeroDias

mas agora queria colocar uma restrição, que é caso o mesmo ainda vá a meio como é o caso de Março, queria que ele contasse apenas 13 dias? Como é que faria o IF?

Link to comment
Share on other sites

Olá,

Não sei se percebi muito bem.

Tens um ciclo While para contar o nr. de dias do mês atual? O SQL Server tem funções que te retornam essa informação.

Vê se isto ajuda:

DECLARE @DataAtual DATETIME = GETDATE();
DECLARE @DiasDoMes INT = DATEDIFF(DAY, @DataAtual, DATEADD(MONTH, 1, @DataAtual))
DECLARE @DiaHoje INT = DATEPART(dd, @DataAtual);

PRINT @DataAtual; -- Resultado: Hoje são 2014-03-13
PRINT @DiasDoMes; -- Resultado: 31 dias, Março tem 31 dias
PRINT @DiaHoje; -- Resultado: 13, Hoje é dia 13

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

Sim eu sei, eu para contar os dias do mes atual estou a utilizar esta

DECLARE @NumeroDias int = DATEPART(DAY, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DataInicial)+1,0)));

mas o que eu quero é que ele me o numero de dia de até hoje, até um máximo do mês actual?

Porque eu estou a utilizar para comparar informação atraves de mês atual com o mês atual do ano anterior, e ao utilizar o procedimento atual, ele retira-me a informação para o mes atual todo, no entanto se ainda vamos no dia 13 queria que ele só me devolvesse a informação até esse dia quer do mês atual quer do mês do ano anterior.

Link to comment
Share on other sites

Olá.

Se percebi bem, queres por exemplo fazer uma comparação de vendas deste mês com o homólogo do ano anterior, mas só até ao dia atual.

Eu faria algo do género:

-- Preparação das varias datas
declare @data_atual datetime, @data_inicio_mes datetime, @data_atual_ano_anterior datetime, @data_inicio_mes_ano_anterior datetime
select @data_atual=convert(datetime, rtrim(year(getdate()))+right(rtrim(100+month(getdate())),2)+right(rtrim(100+day(getdate())),2))
select @data_inicio_mes = DATEADD(dd, 1-DAY(@data_atual), @data_atual)
select @data_atual_ano_anterior = DATEADD(yyyy, -1, @data_atual) 
select @data_inicio_mes_ano_anterior = DATEADD(yyyy, -1, @data_inicio_mes)

-- Consulta de vendas
select SUM(valor) as valor_mes_atual from vendas where emissao between @data_inicio_mes and @data_atual
select SUM(valor) as valor_mes_ano_anterior from vendas where emissao between @data_atual_ano_anterior and @data_inicio_mes_ano_anterior

Não era necessário criar tantas variáveis, mas creio que ajuda a entender.

Link to comment
Share on other sites

Queres fazer com contadores? Então faz, mas não precisas, só tens de usar as funções que o SQL Server te disponibiliza:

DECLARE @DataAtual DATETIME = GETDATE();
DECLARE @Data DATETIME = '2014-04-01'; -- O dia não interessa, é apenas considerado o ano e o mês


DECLARE @MaximoMes DATETIME = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@Data)+1,0))

PRINT @DataAtual; -- Resultado: Hoje são 2014-03-18
PRINT @MaximoMes; -- Resultado: 30 de Abril de 2014
PRINT DATEDIFF(dd, @DataAtual, @MaximoMes); -- Faltam 43 dias para o dia 30 de Abril de 2014

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

Bem penso que já devo ter descoberto parte da minha solução.

DECLARE @DataAtual DATETIME = GETDATE();
DECLARE @DATA DATETIME = '2014-03-01'; -- O dia não interessa, é apenas considerado o ano e o mês
DECLARE @DataDiaAnterior DATETIME = DATEADD(d,-1,@Data);
--select DATEADD(d,-1,@Data);
DECLARE @MaximoMes DATETIME = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@DATA)+1,0))

PRINT DATEDIFF(dd, @DataDiaAnterior,@DataAtual);
PRINT DATEDIFF(dd, @DataDiaAnterior, @MaximoMes) ;

Agora como faço pra restringir até ao máximo do mês?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.