Mostrando las entradas con la etiqueta Programacion. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Programacion. Mostrar todas las entradas

miércoles, 6 de octubre de 2010

SQL Server: Diversion con getdate() y otras funciones bizarras

Creo que hoy me siento algo geek, por eso voy a publicar algunas cosas que ayudarian a mas de uno en lo que se refiere a elaboracion de queries con SQL Server... aunque con un poco de esfuerzo estas mismas pueden portarse a DB2, Oracle, MySQL u otros manejadores de bases de datos que cuenten con algun dialecto de SQL, asi que saquen lapiz y papel que la catedra dara comienzo:

1) Obtener datos en un rango de fechas de una semana: La teoria detras de esto es la siguiente: Supongamos que nuestra Base de Datos (BD) tiene una tabla donde almacenamos los pedidos de clientes y queremos agrupar lo que se ordeno esta semana y la semana pasada Sin importar que dia se corra el query. Habitualmente mas de alguno respondera que con datepart(ww,[campo fecha])-1 bastaria para sacar la semana pasada pero... que ocurriria si corres el query la primer semana de Enero en la cual datepart devuelve 1? El resultado obvio es que tendrias la semana 0!!! Ahora, suponiendo que el primer dia de la semana sera el domingo y el ultimo el sabado entonces algo asi nos puede servir:

declare @domingo as datetime, @sabado as datetime

--Usar la funcion CONVERT y le agregamos el codigo de formato 101 para eliminar la hora de la fecha, getdate() trae ambas cosas y no se pueden separar.
set @domingo=convert(varchar(10),getdate()+(1-datepart(dw,getdate())),101)

set @sabado=convert(varchar(10),getdate()+(7-datepart(dw,getdate())),101)

--Supongamos que la tabla se llama "ordenes"
with lasordenes(fecha,cliente,parte,cantidad) as (
select fecha,cliente,parte,cantidad from ordenes where fecha between @domingo and @sabado --Esta semana
union all
select fecha,cliente,parte,cantidad from ordenes where fecha between @domingo-7 and @sabado-7
--La semana Pasada
)select * from lasordenes order by fecha desc

2) Desplegar la informacion del ejemplo anterior en columnas: Ahora, si quieren una columna con las ordenes de esta semana y las de la semana pero sin incluir fechas, solo numeros de parte, asi es como podrias hacerlo:

declare @domingo as datetime, @sabado as datetime


--igual que antes, le quitamos la hora a la fecha set @domingo=convert(varchar(10),getdate()+(1-datepart(dw,getdate())),101)
set @sabado=convert(varchar(10),getdate()+(7-datepart(dw,getdate())),101)



--Se usa sum() porque no sabemos que fechas puedan venir ademas no es requerido saberlo

select cliente,parte,
sum(case when fecha between @domingo and @sabado then cantidad else 0 end) as [esta semana],
sum(case when fecha between @domingo-7 and @sabado-7 then cantidad else 0 end) as [semana pasada]
from ordenes where fecha between @domingo-7 and @sabado
group by cliente,parte



Estos ejemplos pueden ser de mucha utilidad cuando se requiere manejar lapsos de tiempo, la teoria es bastante simple, para calcular el rango de fechas de una semana siempre que comience en domingo y concluya en sabado entonces hacemos lo siguiente:

* Conocer el dia de la semana actual, para eso usamos datepart(dw,fecha). Aqui obtendremos un numero segun el dia de la semana, domingo=1, lunes=2, etc. (aqui hay mas info sobre como funciona datepart)

*Para saber la fecha del domingo de esta semana, efectuamos la siguiente operacion: fecha de hoy + (1-resultado de datepart(dw,fecha de hoy)), para dejar esto mas claro prueba el siguiente estatuto:

--El resultado es 2010-10-03 18:52:19.617 suponiendo que la fecha actual es 2010-10-06 18:52:19.617
select getdate()+(1-datepart(dw,getdate()))

*Para el sabado la operacion es parecida: fecha de hoy + (7-resultado de datepart(dw,fecha de hoy)), el ejemplo siguiente demuestra los resultados:

--El resultado es 2010-10-09 18:54:40.820 suponiendo que la fecha actual es 2010-10-06 18:54:57.820
select getdate()+(7-datepart(dw,getdate()))


*Ahora a estos resultados les agregamos o sumamos dias segun lo que se requiera, generalmente serian 7 dias para movernos de las fechas de una semana a la otra.

domingo, 10 de enero de 2010

Las faenas diarias de un informatico

Como en todas las profesiones, los informaticos de repente tambien solemos tener nuestros "gajes del oficio" como dirían en cierta publicacion que algunos legalistas usan como base para sus investigaciones de caracter cientifico (que por cierto la calidad de las mismas es bastante dudosa en ocasiones) En algunas ocasiones pueden resultar molestas esas cosas cuando suceden pero luego resultan jocosas, como administrador de sistemas y luego de bases de datos desde hace casi dos años me he dado cuenta que a veces los usuarios vienen siendo una especie de curiosa fauna de la cual a veces no podemos evitar agarrarla de cura (botana o burlarnos de ella... como mejor lo entiendas) Bueno, aqui van ciertas vivencias:

Anecdota 1: El 30 de Febrero

En cierta ocasion llama un usuario a mi extension telefonica y dice "Oye Osorio, tu programa no funciona" "¿Porque?" fue la pregunta logica "Es que no me deja introducir una fecha" "¿Y la tecleaste bien'" "Si" me respondió el usuario "Le tecleo el 30 de Febrero en el campo y no me acepta la fecha"... sin comentarios

Anecdota 2: La pantalla Chiquita

En mis años como instructor de computo recibi un grupo que recien acababa de ver lo mas fundamental (ya saben cosas como ¿Que es windows? y ese tipo de babosadas) a mi me tocaria impartirles los cursos de MS Office, asi que cuando les mostre como iniciar una aplicacion, desde el fondo del aula me llama un alumno, que segun la maestra del curso anterior era el mas adelantado del grupo... "Profe, la pantalla esta muy chiquita" Pense que podria ser una falla de Hardware fui a ver el equipo pero solo era que la ventana del programa no estaba maximizada, total le dije "Maximiza la ventana, dale click en el segundo boton en la orilla" El alumno movio el raton torpemente y dio click en el boton... ¡para minimizar la ventana! "Se borro todo Profe" fue lo que me dijo el alumno... Moraleja: Si el era el mas inteligente de ese grupo ¿que esperar del menos avezado?

Anecdota 3: Otra de mis queridos alumnos

En una clase de Excel les explicaba a mis pupilos "Presionen F2 en cualquier celda y diganme que sucede" "Nada" respondió una alumna. De inmediato supuse lo sucedido... la estudiante presionó las teclas "F" y "2" en lugar de la tecla F2... es obvio que no son lo mismo

Anecdota 4: ¿Porque no prende la PC?

Cierto lunes en la fabrica donde trabajo una parte de la planta se quedó sin energía electrica por una falla de la subestacion, mi extension telefonica sonó y una señorita me dice "Oiga Ingeniero, mi PC no enciende ¿sabe porque?" Le respondí "Esta mañana hubo una falla electrica en la parte de la planta donde tu estas" La persona colgó la llamada inmediatamente, tal vez le dio verguenza

Anecdota 5: ¿Para cuando?

Al revisar el equipo de un usuario me pregunta "¿cuanto te vas a tardar?" le digo "Pues como hay que volver a instalar todos los programas se me hace que para mañana en la tarde te la entrego" Y el me responde "Ah, bueno esta bien... ¿la puedes tener para hoy?"

Bueno, creo que todo informatico lidia con este tipo de cosas en su vida diaria pero precisamente todas estas ondas vienen siendo las que le dan sabor a esto, sino que aburrido seria todo esto

jueves, 25 de septiembre de 2008

Solo para Fanaticos de SQL Server

Estos dias me abstuve de hacer nuevos escritos en este blog porque mi trabajo secular como Administrador de bases de datos me ha mantenido muy ocupado con la transferencia de nuevos procesos y tecnologias que vienen de una planta que la compañia donde trabajo tenia en la ciudad de Boston Mass y esta por cerrarse en Noviembre del presente. Ahh!! menciono mi trabajo secular como si fuera pastor, evangelista o algo asi cuando no soy ninguna de las dos... tal vez sea un falso maestro capaz de hacer quedar a Arrio como un novato pero nada mas.
Bueno, parte del trabajo que tengo que hacer es coordinar la importacion de varios servidores, respaldos de baterias y otros aparatejos a Mexico y tambien modificar algunos programas que se usaban por alla para adaptarlos al proceso productivo de la planta donde su servidor, el Juggernaut trabaja y en esta semana me encontre con un escollo que me mantuvo ocupado desde el viernes hasta hoy: Convertir un pequeño programita que calculaba la curricula de produccion hecho en un lenguaje arcaico al mas moderno SQL Server. A primera vista parecia algo muy sencillo pero conforme fui analizando la lógica del algoritmo me di cuenta que pasar el dichoso programa de un lenguaje procedural a SQL Server que es un lenguaje de consultas. ¿Quieren saber en que acabo la historia? bueno, acabo en que halle la solucion y me puso de tan buen humor el haber logrado esto que ahora voy a publicar el codigo fuente que salvo mi vida en mis 2 blogs. Como podran notar, para efectos de poder publicar mi trabajo quite cualquier referencia a bases de datos reales de la compañia donde trabajo y utilice informacion ficticia, bien... aqui lo tienen.




create table #inv (startitem char(10),stock decimal(18,8),location char(23))
create table #order (saleitem char(10), orqt decimal(18,8))

declare @item char(10),@stocks decimal(18,8),@queda decimal(18,8)


insert into #inv (startitem,location,stock) values ('A','Almacen1',50)
insert into #inv (startitem,location,stock) values ('A','Almacen2',50)
insert into #inv (startitem,location,stock) values ('B','Almacen1',150)
insert into #inv (startitem,location,stock) values ('B','Almacen2',150)
insert into #inv (startitem,location,stock) values ('C','Almacen1',200)
insert into #inv (startitem,location,stock) values ('C','Almacen2',200)
insert into #inv (startitem,location,stock) values ('D','Almacen1',250)
insert into #inv (startitem,location,stock) values ('D','Almacen2',250)

-- Deben salir 4 ordenes de prod. en 0 y 1 con 40 piezas
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',10)
insert into #order (saleitem,orqt) values ('A',100)

--Deben salir 4 ordenes en 0 y una de 20 pzs.
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',20)
insert into #order (saleitem,orqt) values ('B',240);


/* Esto de aqui es una marranada, si lo quieren corregir adelante! */
declare c cursor for select startitem,sum(all stock) from #inv group by startitem

open c

fetch from c into @item,@stocks

while @@fetch_status=0
begin

set @queda=@stocks

/* Esta linea fue la que hizo el milagro =) */
update #order set @queda=orqt=@queda-orqt
where saleitem=@item

fetch next from c into @item,@stocks
end

close c

deallocate c


update #order set orqt=case when orqt>0 then 0 else abs(orqt) end

select * from #order

drop table #inv
drop table #order




PD. Si notaron que hice una marranada en mi codigo fuente, lo digo especialmente por los conocedores del lenguaje, no se preocupen, son libres de modificar este pequeño codigo como ustedes gusten y manden.

sábado, 6 de septiembre de 2008

Ahora soy miembro de la iglesia de emacs

¡¡¡No es cierto!!! ¿a poco pensaban que el Juggernaut se iba a cambiar de religion, ahora si ya no seria cristiano? Bueno, si de por si muchos no pueden aceptar que soy creyente del Evangelio creo que con esto quedaria confirmado (para esas personas que dudan de mi conversion a Cristo) que no soy cristiano. En esas cuestiones digo lo que un vecino que tenia cuando vivia en la ciudad de Monterrey Nuevo Leon cuando alguien tocaba a la puerta de su casa: No compro nada ni cambio de religion yo soy cristiano evangelico Asi no les agrade a ciertas personas o les cueste creerlo. Asi pues, ¿a que viene todo esto? bueno, como administrador de bases de datos soy un profesional de la informatica, eso es requisito, para ese tipo de puestos normalmente no aceptan a un tecnico en computacion (no tengo nada contra ellos, conozco varios muy buenos) pero para un puesto de trabajo como el mio las empresas suelen exigir al menos preparacion universitaria y como se han de imaginar, tambien tengo contacto con software, programas de computo en mi vida diaria y aunque soy usuario y cliente de Microsoft tambien he hallado software libre de excelente calidad y por ello, les presento al santo patrono del software libre y lider de la iglesia de emacs: San Ignucio.





Como podran ver, este icono representa a San Ignucio santo patrono del software libre, ahora quienes apoyamos el software libre tenemos a quien encomendar nuestra causa y elevar nuestras plegarias por la caida del imperio de Gates y aunque yo sea cliente de Microsoft definitivamente no comulgo con la idea del software de "codigo cerrado" que es lo opuesto al software libre. Si alguien noto que este es un post broma debo admitir que si no les resulto divertido, el humor no es el objetivo de este blog porque esta destinado a sacudirles la conciencia a quienes lo leen.
Que la sombra del Altisimo los cubra a todos mis amados y recuerden: Si tienen necesidad en sus corazones oren a YHWH Dios de Israel,Isaac y Jacob pero si quieren que el software libre llegue a las PCs de todo el mundo, entonces encomendense a San Ignucio