PDA

Ver la Versión Completa : between y datetime !!!!!!!!


david_uh
29-06-2007, 23:21:11
Buen día caballeros:

Estoy viendo la sentencia Between trabajando con campos DateTime
tengo un conjunto de datos:...

1| '2007-06-29 14:31:16'
1| '2007-06-29 14:31:16'
1| '2007-06-29 14:31:16'
1| '2007-06-29 14:31:16'
1| '2007-06-30 14:31:16'
2| '2007-06-30 15:08:58'
2| '2007-06-30 15:08:58'
2| '2007-06-30 15:08:58'


pretendo seleccionar entre las fechas '2007-06-29' y '2007-06-30'
escribo esta consulta:
Select tblpagos.id As IdPago, tblpedidos.Total, tblpedidos.NroGuia,
tblpedidos.IdVendedor, tblpedidos.Id As IdPedido, tblpagos.SaldoCom,
tblpedidos.IdSisPago, tblpedidos.FechaEnt, tblpagos.FechaPago, tblpagos.Monto,
tblpedidos.saldo
From tblpedidos Inner Join
tblpagos On tblpedidos.Id = tblpagos.IdPedido
Where tblpedidos.IdVendedor = 2 And tblpagos.FechaPago Between
'2007-06-29' And '2007-06-30'
bien esto me arroja lo siguiente:

1 | 2007-06-29 15:08:58
2 | 2007-06-29 14:31:16
3 | 2007-06-29 14:31:16
4 | 2007-06-29 14:31:16


pero no incluye los del 2007-06-30 :eek: lo que hice fué aumentar el limite superior en un día. osea:

Select tblpagos.id As IdPago, tblpedidos.Total, tblpedidos.NroGuia,
tblpedidos.IdVendedor, tblpedidos.Id As IdPedido, tblpagos.SaldoCom,
tblpedidos.IdSisPago, tblpedidos.FechaEnt, tblpagos.FechaPago, tblpagos.Monto,
tblpedidos.saldo
From tblpedidos Inner Join
tblpagos On tblpedidos.Id = tblpagos.IdPedido
Where tblpedidos.IdVendedor = 2 And tblpagos.FechaPago Between
'2007-06-29' And '2007-06-31'

entonces ahora si arroja esto:

1| '2007-06-29 14:31:16'
1| '2007-06-29 14:31:16'
1| '2007-06-29 14:31:16'
1| '2007-06-29 14:31:16'
1| '2007-06-30 14:31:16'
2| '2007-06-30 15:08:58'
2| '2007-06-30 15:08:58'
2| '2007-06-30 15:08:58'

es decir el límite superior debe ser mayor de un día para incluir el día de rango superior ????

ahora he probado también asi:

Select tblpagos.id As IdPago, tblpedidos.Total, tblpedidos.NroGuia,
tblpedidos.IdVendedor, tblpedidos.Id As IdPedido, tblpagos.SaldoCom,
tblpedidos.IdSisPago, tblpedidos.FechaEnt, tblpagos.FechaPago, tblpagos.Monto,
tblpedidos.saldo
From tblpedidos Inner Join
tblpagos On tblpedidos.Id = tblpagos.IdPedido
Where tblpedidos.IdVendedor = 2 And tblpagos.FechaPago Between
'2007-06-29 14:31:16' And '2007-06-30 15:08:58'

y me arroja todo bien, los 8 registros. osea si es datetime tengo que especificar los limites con hora:mm:ss ???? al parecer si.
Y si no deseo trabajar con hh:mm:ss debo aumentar ellimite superior en un Día??????

gracias por sus aportes

gluglu
29-06-2007, 23:49:41
Si quieres trabajar con márgenes de fechas, y los registros que tienes en tu base de datos, además de la fecha contienen también una hora, pues tendrás que tener en cuenta no sólo la fecha sino además la hora en tu consulta.

Para ello si compones tu consulta sólo con fecha, deberás además para el margen inferior añadir la hora '00:00:00', y para el margen superior '23:59:59'.

Saludos, ;)

OscarBravo
30-06-2007, 01:04:57
Se me ocurre que puedes convertir el campo a caracter y despues obtienes los 10 primeros caracteres del campo DateTime, los cuales corresponde a la fecha Y CON ESE DATO PUEDES GENERAR LA CONSULTA, presindiendo de la hora asi:


(Copy(DateToStr(CampoDeLaTabla.Value),1,10))

Ojalá te pueda servir

AzidRain
30-06-2007, 02:30:44
o mejor aun utiliza algunas de las funciones del motor para filtrar solo por fecha sin tomar en cuenta los minutos...


Select tblpagos.id As IdPago, tblpedidos.Total, tblpedidos.NroGuia,
tblpedidos.IdVendedor, tblpedidos.Id As IdPedido, tblpagos.SaldoCom,
tblpedidos.IdSisPago, tblpedidos.FechaEnt, tblpagos.FechaPago, tblpagos.Monto,
tblpedidos.saldo
From tblpedidos Inner Join
tblpagos On tblpedidos.Id = tblpagos.IdPedido
Where tblpedidos.IdVendedor = 2 And date(tblpagos.FechaPago) Between
'2007-06-29' And '2007-06-30'

No se que motor uses pero todos tienen una funcion que arroja solo la fecha de un datetime.

david_uh
30-06-2007, 17:55:57
si bien estoy usando mysql 5, la funcion Date esta disponible y asi trabaja bien gracias por el dato..

AzidRain
30-06-2007, 18:00:04
mmm... me siento frustrado...hace unos meses me pasó lo mismo y opté por no utilizar datetime sino solo date y guardar la hora en otro lado...nunca se me ocurrió esta solución. Ahora me lo preguntas tu y mira, se me ocurrió a la primera...;)

david_uh
30-06-2007, 18:02:26
Si, suele pasar hasta en las mejores familias ..:)