Array
(
)

Agrupar Intervalo de Datas.

Alex Lekao
   - 13 jun 2012

Ola Boa tarde!!!
Estou com um problema que a principio achei de seria simples.
Preciso agrupar um intervalo de horario.
Tenho um campo datetime e estou extraindo deste campo o horario, so que preciso que tudo que compreender o horario de 00:00:00 as 09:00:00 sera considerado como primeira hora, ou simplemente o numero um escrever realmente primeira hora.
Nao estou conseguindo fazer nem pensar em como fazer isso.
Essa necessidade se da, devido uma situacao que surgiu aqui na empresa, a diretoria deseja saber qual a movimentacao hora a hora da empresa, e assim tomar medidas para os horarios que maior volume de vendas e menor volume de vendas.
Algue poderia me dar uma forca.
desde ja agradeco.
Abraco.
Alex - Lekao

Manu Gura
   - 13 jun 2012

Utilizando case vc não consegue resolver?

Algo tipo:

case when hora between hr_inicio and hr_fim then Primeira hora

Ai agrupa depois.. não sei se é esse o caso...

Alex Lekao
   - 13 jun 2012

pior que nao consegui... estava justamente tentando com o case e nao funcionou.

estou tentando agora fazer com cast e convert mas tive que parar para resolver outro problema, mas ja estou retornando.

mas com o case nao consegui, teria que converter aglumas coisa que nao me lembro agora.

mesmo assim muito obrigado pela forca.

Manu Gura
   - 13 jun 2012

Ééé.. vc vai ter que usar cast ou datepart até.
Mas se for o caso, cola o código aqui e ajustamos isso.
Trabalho bastantinho com isso, vai que posso ajudar.

Em todo caso, boa sorte!

:)

Alex Lekao
   - 14 jun 2012

eh camarada...

eu tentei usar o date part e nao deu certo, vou colar o codigo que coloquei para vc ver.

algumas coisas eu comentei porque estava fazendo testes... rsrsr

mais uma vez obrigado pela forca.

SELECT
TOP 500
/*CASE
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 00:00:00 AND 09:00:00 THEN 1
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 09:00:01 AND 10:00:00 THEN 2
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 10:00:01 AND 11:00:00 THEN 3
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 11:00:01 AND 12:00:00 THEN 4
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 12:00:01 AND 13:00:00 THEN 5
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 13:00:01 AND 14:00:00 THEN 6
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 14:00:01 AND 15:00:00 THEN 7
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 15:00:01 AND 16:00:00 THEN 8
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 16:00:01 AND 17:00:00 THEN 9
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 17:00:01 AND 18:00:00 THEN 10
WHEN DATEPART(HH,R.DTHCAD) BETWEEN 18:00:01 AND 23:59:59 THEN 11
ELSE 0
END,*/
cast(R.DTHCAD as time),
R.DTHCAD,
--R.NUMREQ,
--R.NUMNOT,
R.TOTGERAL
FROM JACSYSDB.DBO.REQVDA AS R
WHERE (1=1)
AND (R.TIPOREQ = VD)

--group by
--datepart(hh,R.DTHCAD)
--R.NUMREQ,
--R.NUMNOT,
--R.TOTGERAL

Alex Lekao
   - 14 jun 2012

OPA... e ae... olha eu aqui novamente... rssr

entao consegui fazer... o codigo que ficou vou colar abaixo.

a unica coisa que nao entendi o que fiz de errado eh que o agrupamento parece nao estar acontecendo.

SELECT
--TOP 500
CASE
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 00:00:00 AND 09:00:00 THEN 01
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 09:00:01 AND 10:00:00 THEN 02
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 10:00:01 AND 11:00:00 THEN 03
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 11:00:01 AND 12:00:00 THEN 04
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 12:00:01 AND 13:00:00 THEN 05
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 13:00:01 AND 14:00:00 THEN 06
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 14:00:01 AND 15:00:00 THEN 07
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 15:00:01 AND 16:00:00 THEN 08
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 16:00:01 AND 17:00:00 THEN 09
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 17:00:01 AND 18:00:00 THEN 10
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 18:00:01 AND 23:59:59 THEN 11
ELSE 00
END as hora,
--cast(R.DTHCAD as time) as tsthora1,
--convert(varchar,R.DTHCAD,8) as tsthora2,
--R.DTHCAD,
--R.NUMREQ,
--R.NUMNOT,
sum(R.TOTGERAL) as total
FROM REQVDA AS R
WHERE (1=1)
AND (R.TIPOREQ = VD)
AND (R.DATEMI = 14/06/2012)
group by
--hora
convert(varchar,R.DTHCAD,8)
--R.NUMREQ,
--R.NUMNOT,
--R.TOTGERAL

order by
--hora
convert(varchar,R.DTHCAD,8)

Bruno Leandro
   - 14 jun 2012

Ola Alex, tente desta forma.

SELECT
TOP 500
CASE
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 0000 AND 0900 THEN 1
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 0901 AND 1000 THEN 2
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1001 AND 1100 THEN 3
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1101 AND 1200 THEN 4
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1201 AND 1300 THEN 5
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1301 AND 1400 THEN 6
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1401 AND 1500 THEN 7
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1501 AND 1600 THEN 8
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1601 AND 1700 THEN 9
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1701 AND 1800 THEN 10
WHEN DATEPART(HHmi,R.DTHCAD) BETWEEN 1801 AND 2359 THEN 11
ELSE 0
END,
cast(R.DTHCAD as time),
R.DTHCAD,
--R.NUMREQ,
--R.NUMNOT,
R.TOTGERAL
FROM JACSYSDB.DBO.REQVDA AS R
WHERE (1=1)
AND (R.TIPOREQ = VD)

group by
1
--R.NUMREQ,
--R.NUMNOT,
--R.TOTGERAL

Alex Lekao
   - 14 jun 2012

Oooopa... eu aqui novamente....

camarada consegui resolver o agrupamento, repeti o case no group by e no order by, vou colar novamente o codigo abaixo.

agora se houver uma maneira de otimizar o script ou outra forma de faze-lo, algo que fique melhor mais profissional, etc.

aceito sugestoes... rsrsr

eh isso abraco e muito obrigado.

SELECT
CASE
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 00:00:00 AND 09:00:00 THEN 01
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 09:00:01 AND 10:00:00 THEN 02
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 10:00:01 AND 11:00:00 THEN 03
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 11:00:01 AND 12:00:00 THEN 04
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 12:00:01 AND 13:00:00 THEN 05
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 13:00:01 AND 14:00:00 THEN 06
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 14:00:01 AND 15:00:00 THEN 07
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 15:00:01 AND 16:00:00 THEN 08
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 16:00:01 AND 17:00:00 THEN 09
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 17:00:01 AND 18:00:00 THEN 10
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 18:00:01 AND 23:59:59 THEN 11
ELSE 00
END as hora,
--cast(R.DTHCAD as time) as tsthora1,
--convert(varchar,R.DTHCAD,8) as tsthora2,
--R.DTHCAD,
--R.NUMREQ,
--R.NUMNOT,
sum(R.TOTGERAL) as total
FROM REQVDA AS R
WHERE (1=1)
AND (R.TIPOREQ = VD)
AND (R.DATEMI = 14/06/2012)
group by
CASE
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 00:00:00 AND 09:00:00 THEN 01
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 09:00:01 AND 10:00:00 THEN 02
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 10:00:01 AND 11:00:00 THEN 03
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 11:00:01 AND 12:00:00 THEN 04
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 12:00:01 AND 13:00:00 THEN 05
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 13:00:01 AND 14:00:00 THEN 06
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 14:00:01 AND 15:00:00 THEN 07
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 15:00:01 AND 16:00:00 THEN 08
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 16:00:01 AND 17:00:00 THEN 09
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 17:00:01 AND 18:00:00 THEN 10
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 18:00:01 AND 23:59:59 THEN 11
ELSE 00
END
--hora
--convert(varchar,R.DTHCAD,8)
--R.NUMREQ,
--R.NUMNOT,
--R.TOTGERAL

order by
CASE
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 00:00:00 AND 09:00:00 THEN 01
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 09:00:01 AND 10:00:00 THEN 02
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 10:00:01 AND 11:00:00 THEN 03
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 11:00:01 AND 12:00:00 THEN 04
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 12:00:01 AND 13:00:00 THEN 05
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 13:00:01 AND 14:00:00 THEN 06
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 14:00:01 AND 15:00:00 THEN 07
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 15:00:01 AND 16:00:00 THEN 08
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 16:00:01 AND 17:00:00 THEN 09
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 17:00:01 AND 18:00:00 THEN 10
WHEN convert(varchar,R.DTHCAD,8) BETWEEN 18:00:01 AND 23:59:59 THEN 11
ELSE 00
END
--hora
--convert(varchar,R.DTHCAD,8)

Alex Lekao
   - 14 jun 2012

Oi Bruno, bom dia!!!

Cara nao vi seu post quando postei a resposta...

entao vou testar com seu codigo tbm para verificar como fica.

Brigadao pela foca.

Alex Lekao
   - 14 jun 2012

Oi Bruno, bom dia!!!

Deu mensagem que HHmi nao eh uma opcao datepart reconhecida.

Mais uma vez muito obrigado.

Manu Gura
   - 14 jun 2012

Éé Alex.. assim num vai rolar..

Faz assim:

WHEN convert(date,R.DTHCAD,108) BETWEEN 00:00:00 AND 09:00:00 THEN 1

Veja que formato você tá salvando as datas no banco... aaaa-mm-dd ou aa-mm-dd pra daí sim usar o convert certo.
Qualquer dúvida, de uma olhada aqui óó:
http://msdn.microsoft.com/pt-br/library/ms187928.aspx

Diz aí se rolou ou não.

Abrass

Manu Gura
   - 14 jun 2012

Num fico como link ali, mas num dá nada..

Observe aquela tabela que tem de Estilo de data e hora.. acho que ajuda!

:)

Alex Lekao
   - 14 jun 2012

Oi Manu, boa tarde!!!

Entao com esse convert que vc postou nao da certo porque vai converter datahora para data, ai vai usar somente as datas.

to dando uma olhada no link que mandou.

Obrigado.

Manu Gura
   - 14 jun 2012

Ahh beleza..

É, vai ter q achar o convert certo pro teu formato de data. Espero que o link ajude então...

:)

Conta aqui se deu certo..

Alex Lekao
   - 14 jun 2012

blz...

um dos posts que cologuei acima eu ja tinha conseguido o formato adequado.

so estava com problema com o agrupamento, mas usei o mesmo case no agrupamento e na ordenacao e deu certo.

agora so precisaria saber se esse codigo ta bom ou se da para melhorar por causa de desempenho essas coisas...

mais uma vez... muito obrigado.

Manu Gura
   - 14 jun 2012

ahh taaah.. posta o código de novo??

:)

Manu Gura
   - 14 jun 2012

Não precisa.. já achei o certo.. haha

Manu Gura
   - 14 jun 2012

Seguinte.. por que vc não trabalha com uma tabela auxiliar??

Ou outra sugestão, tranforma teu select em udf.. e ai depois no select da udf, usa o group by e order by..

O que vc acha?? Serve no teu caso??

Manu Gura
   - 15 jun 2012

Outra sugestão..

Transforme esse select em view.. e depois ordena/agrupa o select da view.

;)

Alex Lekao
   - 15 jun 2012

Oi.. bom dia!!!

muito obrigado pelas dicas...

Cara... apesar de eu ter feito curso... sou muito novato neste mundo do SQL e do SQL Server...

entao nao conheco bem alguns detalhes tecnicos a respeito, e algumas das coisas que vc sugeriu eu nao conheco bem como faz...

mas vou pesquisar a respeito e ver o que consigo como opcao ao script montado.

Muito obrigado mesmo pela forca e empenho em me ajudar, sua atitude amina quem ta comecando, parabens!!!

Obrigadno novamente.

Abraco.

Manu Gura
   - 15 jun 2012

De nada!

E qualquer coisa pergunte mesmo... Estamos aí pra isso..

Abraço! :)