martes, noviembre 02, 2010

SQL Filtro de Registros por Hora

Tenia un SQL que filtraba registros por hora -sin fecha-, o basado en un horario.
El caso era, obtener el nombre del horario en el cual una persona deslizaba/marcaba su gafete/badge.


Funcionaba en Access sin problemas:
" SELECT -campos-" +
" FROM   -tabla-   "+
" WHERE  HoraInicial < #" + DateTime.Now.ToShortTimeString() + "#" +
" AND HoraFinal> #" + DateTime.Now.ToShortTimeString() + #'";

Donde "DateTime.Now.ToShortTimeString()" es la hora en que la persona deslizaba su gafete.

Pero ahora que modifico el programa -en C# - y leer los datos desde SQL Server, esto pues no funciona, creí que solo reemplazando los # (gatitos o pound o sharp) por ' (comilla simple) funcionaria, pero no fue así.

Para no reinventar la rueda, googleé por unos minutos, pero las respuestas que encontraban no me satisfacian porque se tenia que crear funciones y agregarlas a la base de datos, cosa que para este caso no es lo recomendable y hubo otras que estan completamente equivocadas. por ejemplo no distinguen entre AM y PM, o bien tienes que hacer malabares con la fecha para obtener la hora, etc .

Después de haber visto algunas otras soluciones, hubo una que me ayudo a completar el filtro que necesitaba, finalmente quedo :
" SELECT -campos-" +
" FROM -tabla-" +
" WHERE " +
" CONVERT(VARCHAR,HoraInicial ,108) <= '" + DateTime.Now.ToString("HH:mm:ss:") + "' " +
" AND " +
" CONVERT(VARCHAR,HoraFinal ,108) >= '" + DateTime.Now.ToString("HH:mm:ss:") + "'";

Esto es para mi futura referencia, y por si caso a alguien mas le pueda servir.