Showing posts with label SQL. Show all posts
Showing posts with label SQL. Show all posts

Friday, December 10, 2010

SQL: agrupar registros por un intervalo arbitrario

Recientemente, un compañero me presento un problema, necesitaba escribir un query que agrupara registros por intervalos de 5,10,15 minutos, idealmente queria que se pudiera pasar un parametro al query para especificar el intervalo, despues de unos minutos di con la solucion:

declare @interval int

set @interval = 5
select datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval
, count(*)
from thetable
group by datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval

El truco esta en @interval*@interval, aunque parece que la division y multiplicacion se eliminan entre si, lo que realmente pasa ahi es una division entera, la cual al multiplicarla por el mismo valor, nos da los intervalos correctos.

He aqui una lista de valores generados para un intervalo de 5

minuto|dividido por 5|multiplicado por 5
0 | 0 | 0
1 | 0 | 0
...
5 | 1 | 5
6 | 1 | 5
...
10 | 2 | 10
11 | 2 | 10
...
Teniendo esto se pueden agregar mas campos al select, o hacer la presentacion del tiempo mas bonito, etc

declare @interval int
set @interval = 5
select convert(varchar(8), DTColumn, 1)+' '
      +convert(varchar(2), datepart(hh, DTColumn))+':'
      +convert(varchar(2), datepart(mi, DTColumn)/@interval*@interval)
, count(*)
from the_table
group by convert(varchar(8), DTColumn, 1)+' '
      +convert(varchar(2), datepart(hh, DTColumn))+':'

      +convert(varchar(2), datepart(mi, DTColumn)/@interval*@interval)


Esto nos da algo asi:

11/12/10 10:10    28

11/12/10 10:15    11

11/12/10 10:20    57

Espero le sea de utilidad a alguien

Sunday, July 20, 2008

No se puede actualizar funcion de SQL mientras la estas debugueando

El articulo aplica a: SQL debugging
keywords: SQL, debugging, VS2005, functions, stored procedures

Esto lo aprendi en dias pasados mientras que estaba conectado usando RD (Remote Desktop) a mi computadora del trabajo y estaba debuggeando una funcion SQL desde VS2005; luego encontre un bug en esta y procedi a actualizar la funcion externamente usando Microsoft SQL Server Management Express (uff, que cansado decir todo eso), pero al ejecutar el alter function tomaba muchisimo tiempo y nunca regresaba, pense que era algo que tenia que ver con mi sesion RD, asi que me conecte directamente al servidor e intente de nuevo con el mismo resultado, despues de algunos minutos de esperar a SQL a que actualizara mi funcion me di cuenta que estaba debugueando y estaba detenido en un breakpoint en esa funcion, cerre VS, intente de nuevo y listo, funciono instantaneamente.

Pues si, fue mi culpa, pero nunca me dio un timeout ni tampoco un mensaje indicando cual era el problema, que pasaria si dos desarrolladores estuvieran trabajando en la misma cosa?
Talvez podrian hacer algo en esa area para arreglar ese problema, no creo que sea demasiado dificil, despues de todo sabe que esta bloqueada, porque no dar un mensaje al usuario?

Creo que esto mismo aplica a stored procedures pero no lo he probado

Pero bueno, queria compartir mi experiencia con ustedes, y espero que esto le sirva a alguien.