problema al consultar fecha

23/11/2005 - 14:44 por Nicolas Ibarra Salazar | Informe spam
Estimados, necesito algun tip.
Tengo un campo seteado como SMALLDATETIME, donde guardo la fecha y hora del
momento en que se inserta el registro, mediante GETDATE()
El problema que se me presenta es el siguiente:
Si tengo un registro con el valor '23/11/2005 10:41:03' y quiero consultar
todos los registros del día '23/11/2005', no me trae nada, pero si uncluyo
las horas, minutos y segundos, si lo trae.
Alguna idea de como solucionar esto? solo quiero consultar por fecha, sin
horas ni minutos y menos, segundos...

Todo esta en español, sistema operativo, sql, la base, etc.

Preguntas similare

Leer las respuestas

#1 Carlos Sacristán
23/11/2005 - 14:57 | Informe spam
Usa la función DATEDIFF (mira en los BOL la información), pero sería una
cosa así:

SELECT * FROM tuTabla WHERE DATEDIFF(day, '20051123', tuCampoFecha)
= 0

Eso sí, el índice que pudieras tener sobre ese campo no te va a servir,
por lo que si la tabla tiene muchos datos la sentencia no va a tener un
rendimiento muy bueno.


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Nicolas Ibarra Salazar" escribió en el mensaje
news:OAZD#
Estimados, necesito algun tip.
Tengo un campo seteado como SMALLDATETIME, donde guardo la fecha y hora


del
momento en que se inserta el registro, mediante GETDATE()
El problema que se me presenta es el siguiente:
Si tengo un registro con el valor '23/11/2005 10:41:03' y quiero consultar
todos los registros del día '23/11/2005', no me trae nada, pero si uncluyo
las horas, minutos y segundos, si lo trae.
Alguna idea de como solucionar esto? solo quiero consultar por fecha, sin
horas ni minutos y menos, segundos...

Todo esta en español, sistema operativo, sql, la base, etc.


Respuesta Responder a este mensaje
#2 Nicolas Ibarra Salazar
23/11/2005 - 14:57 | Informe spam
Encontré una forma...
Para obtener todos los registros del dia '23/11/2005' puedo obtenerlos con
between '23/11/2005 00:00:00' and '23/11/2005 23:59:59'
pero es una cagada... :(


"Nicolas Ibarra Salazar" escribió en el mensaje
news:OAZD%
Estimados, necesito algun tip.
Tengo un campo seteado como SMALLDATETIME, donde guardo la fecha y hora
del momento en que se inserta el registro, mediante GETDATE()
El problema que se me presenta es el siguiente:
Si tengo un registro con el valor '23/11/2005 10:41:03' y quiero consultar
todos los registros del día '23/11/2005', no me trae nada, pero si uncluyo
las horas, minutos y segundos, si lo trae.
Alguna idea de como solucionar esto? solo quiero consultar por fecha, sin
horas ni minutos y menos, segundos...

Todo esta en español, sistema operativo, sql, la base, etc.

Respuesta Responder a este mensaje
#3 Alejandro Mesa
23/11/2005 - 16:25 | Informe spam
Nicolas Ibarra Salazar,

Al menos que no estes guardando los milisegundos, este no es el patron a usar.

Ejemplo:

use northwind
go

create table t1 (
c1 datetime not null
)

insert into t1 values('2005-11-23 23:59:59')
insert into t1 values('2005-11-23 23:59:59:003')
insert into t1 values('2005-11-23 23:59:59:007')

select *
from t1
where c1 between '2005-11-23 00:00:00' and '2005-11-23 23:59:59'

drop table t1
go

Como vez, solo devuelve una fila. El patron que debes usar es el siguiente:

declare @d datetime

set @d = '2005-11-23 00:00:00'

select *
from t1
where c1 >= @d and c1 < dateadd(day, 1, @d)

fijate que la fecha debe tener como hora las 00:00:00.000, de lo contrario
debes resetear la fecha a que tome esa hora usando:

set @d = convert(char(8), @d, 112)

Otra recomendacion es no usar formato de fecha ligado a un lenguaje o
formato especifico, pues el mismo codigo puede fallar si el lenguaje es
diferente al que trabajas en ese server y / o db y tambien si el formato de
fecha es cambiado en tiempo de ejecucion. Por ejemplo, mi sistema usa el
lenguaje "us_english" y la forma en sql server interpreta las constantes de
fecha usando este lenguaje es mm/dd/yyyy por lo que tu ejemplo me dio error
al tratar de probarlo.

Ejemplo:

set dateformat mdy
go

select cast( '23/11/2005 00:00:00' as datetime)
go

Sin embargo, si usas los estilos ISO o ISO8601 (ve la funcion convert en los
libros en linea, estilos 112 y 126) entonces sql server siempre interpretara
correctamente las constantes de fecha sin iportar el lenguaje o seteo de
"dateformat" en uso.

set dateformat mdy
go

select cast( '2005-11-23T00:00:00' as datetime)
go

set dateformat dmy
go

select cast( '2005-11-23T00:00:00' as datetime)
go


AMB

"Nicolas Ibarra Salazar" wrote:

Encontré una forma...
Para obtener todos los registros del dia '23/11/2005' puedo obtenerlos con
between '23/11/2005 00:00:00' and '23/11/2005 23:59:59'
pero es una cagada... :(


"Nicolas Ibarra Salazar" escribió en el mensaje
news:OAZD%
> Estimados, necesito algun tip.
> Tengo un campo seteado como SMALLDATETIME, donde guardo la fecha y hora
> del momento en que se inserta el registro, mediante GETDATE()
> El problema que se me presenta es el siguiente:
> Si tengo un registro con el valor '23/11/2005 10:41:03' y quiero consultar
> todos los registros del día '23/11/2005', no me trae nada, pero si uncluyo
> las horas, minutos y segundos, si lo trae.
> Alguna idea de como solucionar esto? solo quiero consultar por fecha, sin
> horas ni minutos y menos, segundos...
>
> Todo esta en español, sistema operativo, sql, la base, etc.
>



Respuesta Responder a este mensaje
#4 Isaias
23/11/2005 - 17:32 | Informe spam
¿No es mejor como recomienda MAXI, con >= AND <=?

Al menos, a mi me funciona y lo hace de forma eficiente.
Saludos
IIslas


"Alejandro Mesa" escribió:

Nicolas Ibarra Salazar,

Al menos que no estes guardando los milisegundos, este no es el patron a usar.

Ejemplo:

use northwind
go

create table t1 (
c1 datetime not null
)

insert into t1 values('2005-11-23 23:59:59')
insert into t1 values('2005-11-23 23:59:59:003')
insert into t1 values('2005-11-23 23:59:59:007')

select *
from t1
where c1 between '2005-11-23 00:00:00' and '2005-11-23 23:59:59'

drop table t1
go

Como vez, solo devuelve una fila. El patron que debes usar es el siguiente:

declare @d datetime

set @d = '2005-11-23 00:00:00'

select *
from t1
where c1 >= @d and c1 < dateadd(day, 1, @d)

fijate que la fecha debe tener como hora las 00:00:00.000, de lo contrario
debes resetear la fecha a que tome esa hora usando:

set @d = convert(char(8), @d, 112)

Otra recomendacion es no usar formato de fecha ligado a un lenguaje o
formato especifico, pues el mismo codigo puede fallar si el lenguaje es
diferente al que trabajas en ese server y / o db y tambien si el formato de
fecha es cambiado en tiempo de ejecucion. Por ejemplo, mi sistema usa el
lenguaje "us_english" y la forma en sql server interpreta las constantes de
fecha usando este lenguaje es mm/dd/yyyy por lo que tu ejemplo me dio error
al tratar de probarlo.

Ejemplo:

set dateformat mdy
go

select cast( '23/11/2005 00:00:00' as datetime)
go

Sin embargo, si usas los estilos ISO o ISO8601 (ve la funcion convert en los
libros en linea, estilos 112 y 126) entonces sql server siempre interpretara
correctamente las constantes de fecha sin iportar el lenguaje o seteo de
"dateformat" en uso.

set dateformat mdy
go

select cast( '2005-11-23T00:00:00' as datetime)
go

set dateformat dmy
go

select cast( '2005-11-23T00:00:00' as datetime)
go


AMB

"Nicolas Ibarra Salazar" wrote:

> Encontré una forma...
> Para obtener todos los registros del dia '23/11/2005' puedo obtenerlos con
> between '23/11/2005 00:00:00' and '23/11/2005 23:59:59'
> pero es una cagada... :(
>
>
> "Nicolas Ibarra Salazar" escribió en el mensaje
> news:OAZD%
> > Estimados, necesito algun tip.
> > Tengo un campo seteado como SMALLDATETIME, donde guardo la fecha y hora
> > del momento en que se inserta el registro, mediante GETDATE()
> > El problema que se me presenta es el siguiente:
> > Si tengo un registro con el valor '23/11/2005 10:41:03' y quiero consultar
> > todos los registros del día '23/11/2005', no me trae nada, pero si uncluyo
> > las horas, minutos y segundos, si lo trae.
> > Alguna idea de como solucionar esto? solo quiero consultar por fecha, sin
> > horas ni minutos y menos, segundos...
> >
> > Todo esta en español, sistema operativo, sql, la base, etc.
> >
>
>
>
Respuesta Responder a este mensaje
#5 Alejandro Mesa
23/11/2005 - 18:40 | Informe spam
Isaias,

¿No es mejor como recomienda MAXI, con >= AND <=?



Si tienes una columna datetime y guardas valores, por ejemplo usando
getdate(), entonces habra valores que contienen el rango completo de tiempo
entre las 00:00:00.000 y las 23:59:59.997. No veo como usar el operador <=
para seleccionar todas las filas de un dia especifico. Puedes postear un
ejemplo y si es posible tambien el articulo donde Maxi recomienda ese patron?

Recuerda que sql server almacena los valores datetime con una precision de
0.00333 segundos, asi que el valor '2005-11-23T23:59:59.998' sera
interpretado como '2005-11-23T23:59:59.997' y '2005-11-23T23:59:59.999' sera
interpretado como '2005-11-24T00:00:00.000'

Ejemplo:

select cast('2005-11-23T23:59:59.998' as datetime)
go

select cast('2005-11-23T23:59:59.999' as datetime)
go


AMB

"Isaias" wrote:

¿No es mejor como recomienda MAXI, con >= AND <=?

Al menos, a mi me funciona y lo hace de forma eficiente.
Saludos
IIslas


"Alejandro Mesa" escribió:

> Nicolas Ibarra Salazar,
>
> Al menos que no estes guardando los milisegundos, este no es el patron a usar.
>
> Ejemplo:
>
> use northwind
> go
>
> create table t1 (
> c1 datetime not null
> )
>
> insert into t1 values('2005-11-23 23:59:59')
> insert into t1 values('2005-11-23 23:59:59:003')
> insert into t1 values('2005-11-23 23:59:59:007')
>
> select *
> from t1
> where c1 between '2005-11-23 00:00:00' and '2005-11-23 23:59:59'
>
> drop table t1
> go
>
> Como vez, solo devuelve una fila. El patron que debes usar es el siguiente:
>
> declare @d datetime
>
> set @d = '2005-11-23 00:00:00'
>
> select *
> from t1
> where c1 >= @d and c1 < dateadd(day, 1, @d)
>
> fijate que la fecha debe tener como hora las 00:00:00.000, de lo contrario
> debes resetear la fecha a que tome esa hora usando:
>
> set @d = convert(char(8), @d, 112)
>
> Otra recomendacion es no usar formato de fecha ligado a un lenguaje o
> formato especifico, pues el mismo codigo puede fallar si el lenguaje es
> diferente al que trabajas en ese server y / o db y tambien si el formato de
> fecha es cambiado en tiempo de ejecucion. Por ejemplo, mi sistema usa el
> lenguaje "us_english" y la forma en sql server interpreta las constantes de
> fecha usando este lenguaje es mm/dd/yyyy por lo que tu ejemplo me dio error
> al tratar de probarlo.
>
> Ejemplo:
>
> set dateformat mdy
> go
>
> select cast( '23/11/2005 00:00:00' as datetime)
> go
>
> Sin embargo, si usas los estilos ISO o ISO8601 (ve la funcion convert en los
> libros en linea, estilos 112 y 126) entonces sql server siempre interpretara
> correctamente las constantes de fecha sin iportar el lenguaje o seteo de
> "dateformat" en uso.
>
> set dateformat mdy
> go
>
> select cast( '2005-11-23T00:00:00' as datetime)
> go
>
> set dateformat dmy
> go
>
> select cast( '2005-11-23T00:00:00' as datetime)
> go
>
>
> AMB
>
> "Nicolas Ibarra Salazar" wrote:
>
> > Encontré una forma...
> > Para obtener todos los registros del dia '23/11/2005' puedo obtenerlos con
> > between '23/11/2005 00:00:00' and '23/11/2005 23:59:59'
> > pero es una cagada... :(
> >
> >
> > "Nicolas Ibarra Salazar" escribió en el mensaje
> > news:OAZD%
> > > Estimados, necesito algun tip.
> > > Tengo un campo seteado como SMALLDATETIME, donde guardo la fecha y hora
> > > del momento en que se inserta el registro, mediante GETDATE()
> > > El problema que se me presenta es el siguiente:
> > > Si tengo un registro con el valor '23/11/2005 10:41:03' y quiero consultar
> > > todos los registros del día '23/11/2005', no me trae nada, pero si uncluyo
> > > las horas, minutos y segundos, si lo trae.
> > > Alguna idea de como solucionar esto? solo quiero consultar por fecha, sin
> > > horas ni minutos y menos, segundos...
> > >
> > > Todo esta en español, sistema operativo, sql, la base, etc.
> > >
> >
> >
> >
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida