Consulta sobre SELECT

13/12/2007 - 16:36 por Cristian Meneses | Informe spam
Buenas tardes
Tengo la siguiente consulta sacada de este mismo foro para luego sacar
la diferencia entre Entradas y Salidas.

select
t1.IDLegajo,
convert(varchar(8),t1.Fecha,114) as 'Entrada',
(
select convert(varchar(8),ISNULL(max(Fecha), '99991231
23:59:59.998') ,114)
from #AUXFichadas t2
where t2.idlegajo = t1.idlegajo and
t2.Ingreso = 0 and
t2.fecha >= t1.Fecha and
t2.fecha <= (
select isnull(min(fecha),
'99991231 23:59:59.998')
from #AUXFichadas
where idlegajo = t2.idlegajo and
Ingreso = 1 and
Fecha > t1.Fecha
)
) as 'Salida'
FROM #AUXFichadas t1 WHERE t1.Ingreso=1

La estructura de #AUXFichadas:
IDLegajo, int
Fecha, smalldatetime
Ingreso, bit (si es 1 es Entrada sino Salida)

El problema es que a veces tengo que la primer fichada del dia es
Salida y no me la muestra en la consulta porque comienza desde la
primer entrada en adelante. La idea es que en este caso, muestre en
Entrada el valor 0:00:01 y salida el valor de la fichada.
Gracias de antemano, saludos


Cristian Meneses

Preguntas similare

Leer las respuestas

#1 Carlos M. Calvelo
13/12/2007 - 20:17 | Informe spam
Hola Cristian,

On 13 dec, 16:36, Cristian Meneses wrote:
Buenas tardes
Tengo la siguiente consulta sacada de este mismo foro para luego sacar
la diferencia entre Entradas y Salidas.

select
t1.IDLegajo,
convert(varchar(8),t1.Fecha,114) as 'Entrada',
(
select convert(varchar(8),ISNULL(max(Fecha), '99991231
23:59:59.998') ,114)
from #AUXFichadas t2
where t2.idlegajo = t1.idlegajo and
t2.Ingreso = 0 and
t2.fecha >= t1.Fecha and
t2.fecha <= (
select isnull(min(fecha),
'99991231 23:59:59.998')
from #AUXFichadas
where idlegajo = t2.idlegajo and
Ingreso = 1 and
Fecha > t1.Fecha
)
) as 'Salida'
FROM #AUXFichadas t1 WHERE t1.Ingreso=1

La estructura de #AUXFichadas:
IDLegajo, int
Fecha, smalldatetime
Ingreso, bit (si es 1 es Entrada sino Salida)

El problema es que a veces tengo que la primer fichada del dia es
Salida y no me la muestra en la consulta porque comienza desde la
primer entrada en adelante. La idea es que en este caso, muestre en
Entrada el valor 0:00:01 y salida el valor de la fichada.
Gracias de antemano, saludos




Reconozco la consulta; la he puesto yo para ayudar con otro problema.

La consulta selecciona todas las entradas y busca para cada entrada
la salida correspondiente. La consulta, digámoslo así, 'no razona'
en periodos de un día. Si el primer registro del día es una salida,
la entrada correspondiente tendría que estar en el dia anterior.
La consulta también hace los siguiente: si tenemos una entrada y
después varias salidas sin sus correspondientes entradas, la
consulta devuelve la última. O sea la mayor de todas las salidas
anteriores a la próxima entrada.

Por lo que dices entiendo que el primer registro de un día
determinado tiene que ser una entrada y el último registro del
día una salida.
Es asi?

Y si durante ese día hay varias entradas sin sus correspondientes
salidas? O varias salidas sin sus correspondientes entradas?

Y si para un día determinado ya existe una entrada
a las 11:59:59 horas?

Y si para un día determinado ya existe una salida
a las 00:00:00 horas?

Una posibilidad es que en tu tabla introduzcas un registro de
entrada a las 00:00:00 horas para todos los días que empiezan
con una salida y un registro de salida a a als 23:59:59,999 horas
para todos los días que terminan con una entrada.

Ya ves... me gustaría ayudarte pero todo son preguntas.

Saludos,
Carlos
Respuesta Responder a este mensaje
#2 Cristian Meneses
13/12/2007 - 20:36 | Informe spam
Hola Carlos
Gracias por tu pronta respuesta.
El problema real lo tengo con los turnos nocturnos, donde hay una
fichada de entrada por la noche y otra de salida por la mañana.
Lo que necesito es que funcione como esta actualmente, pero con el
agregado de suponer una entrada (que no existe realmente en la base de
datos) a las 0:00:00 y asi que aparezca la salida.
El codigo tuyo lo modifique, para que haga lo mismo si la ultima
salida del dia es null. De forma que si el ultimo registro del dia es
entrada, se crea una supuesta salida (no fisica) a las 23:59:59.
Ademas lo utilizo dentro de una funcion donde paso como parametro una
fecha en particular, es decir que no debo ver las fichadas del dia
anterior ni posterior ni de otro dia, solo del dia que se solicita.
Una de las cosas que se me habian ocurrido era utilizar una tabla
temporal e inmediatamente de haberla llenado, buscar si el primer
registro es salida e insertar una fichada a las 0:00:00 como
ingreso.
En fin, me parecio muy buena tu funcion y solo tengo este problema al
que espero resolverlo.
Saludos y gracias nuevamente


Cristian Meneses
Respuesta Responder a este mensaje
#3 Cristian Meneses
13/12/2007 - 20:37 | Informe spam
Carlos
Olvidaba decirte que siempre se respeta la secuencia Entrada, Salida,
Entrada, Salida
Saludos


Cristian
Respuesta Responder a este mensaje
#4 Carlos M. Calvelo
13/12/2007 - 22:10 | Informe spam
Hola Cristian,


On 13 dec, 20:36, Cristian Meneses wrote:
Hola Carlos
Gracias por tu pronta respuesta.
El problema real lo tengo con los turnos nocturnos, donde hay una
fichada de entrada por la noche y otra de salida por la mañana.
Lo que necesito es que funcione como esta actualmente, pero con el
agregado de suponer una entrada (que no existe realmente en la base de
datos) a las 0:00:00 y asi que aparezca la salida.
El codigo tuyo lo modifique, para que haga lo mismo si la ultima
salida del dia es null. De forma que si el ultimo registro del dia es
entrada, se crea una supuesta salida (no fisica) a las 23:59:59.
Ademas lo utilizo dentro de una funcion donde paso como parametro una
fecha en particular, es decir que no debo ver las fichadas del dia
anterior ni posterior ni de otro dia, solo del dia que se solicita.
Una de las cosas que se me habian ocurrido era utilizar una tabla
temporal e inmediatamente de haberla llenado, buscar si el primer
registro es salida e insertar una fichada a las 0:00:00 como
ingreso.
En fin, me parecio muy buena tu funcion y solo tengo este problema al
que espero resolverlo.




Repito aquí tu consulta, donde solo he cambiado el FROM
de la consulta exterior.
En el FROM se genera un registro de entrada por día, por
'IDLegajo' si en ese día la menor fecha es una salida.



select
t1.IDLegajo,
convert(varchar(8),t1.Fecha,114) as 'Entrada',
(
select convert(varchar(8),ISNULL(max(Fecha), '99991231
23:59:59.998') ,114)
from #AUXFichadas t2
where t2.idlegajo = t1.idlegajo and
t2.Ingreso = 0 and
t2.fecha >= t1.Fecha and
t2.fecha <= (
select isnull(min(fecha),
'99991231 23:59:59.998')
from #AUXFichadas
where idlegajo = t2.idlegajo and
Ingreso = 1 and
Fecha > t1.Fecha
)
) as 'Salida'


FROM
(
select IDLegajo, Fecha, Ingreso from #AUXFichadas
where Ingreso = 1
UNION
select IDLegajo,
convert(varchar(10), fecha, 126) as Fecha,
1 as Ingreso
from #AUXFichadas t0
where Ingreso=0 and
fecha = (select min(fecha)
from #AUXFichadas
where IDLegajo = t0.IDLegajo and
year(Fecha) = year(t0.Fecha) and
month(Fecha)= month(t0.Fecha) and
day(Fecha) = day(t0.Fecha))
) t1

Saludos,
Carlos
Respuesta Responder a este mensaje
#5 Cristian Meneses
14/12/2007 - 12:53 | Informe spam
Muchas gracias Carlos!
Funciono a la perfeccion
Saludos


Cristian Meneses
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida