Uso del Convert y/o Cast

18/06/2008 - 19:22 por Duvan | Informe spam
Hola a todos tengo un problema para convertir unas fechas, alguno de ustedes
me podria ayudar, el caso es el siguiente:

no me unciona la busqueda aqui:
2003-09-30 00:00:00.000 campo con nombre fecha
para este utlizo la sentencia SELECT * FROM BTOEXCCANTODOS WHERE convert
(varchar,FECHA, 111 ) = convert(varchar,getdate(),111)


y el otro 2003-03-29 10:10:25.000 campo con nombre oadatime
SELECT * FROM OPTAUDIT WHERE convert (varchar,OADATETIME, 111 ) =
convert(varchar,getdate(),111)



y aqui funciona la busqueda

He intendado con el cast pero no ha sido posible.

Gracias por su colaboracion

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
18/06/2008 - 23:37 | Informe spam
Duvan,

Si manipulas la columna, como lo estas haciendo ahora en la clausula
"where", entonces obligas a sql server a hacer un rastreo (scan) de el indice
o la tabla, sin darle opcion a que pueda hacer una busqueda rapida (seek).

Si tu consulta trata de buscar todas las filas cuya fecha es igual a la
fecha corriente, sin importar el tiempo, entonces debes usar el patron:

...
where
columna_fecha >= dateadd(day, datediff(day, 0, getdate()), 0)
and columna_fecha < dateadd(day, datediff(day, 0, getdate()) + 1, 0)

En palabras, si la columna tipo datetime es mayor o igual que hoy a las
00:00:00.000 y menor a mañana a las 00:00:00.000

Asi que la consulta quedaria:

SELECT *
FROM BTOEXCCANTODOS
WHERE
FECHA >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
AND FECHA < DATEADD(day, DATEDIFF(day, 0, GETDATE()) + 1, 0)
GO


AMB


"Duvan" wrote:

Hola a todos tengo un problema para convertir unas fechas, alguno de ustedes
me podria ayudar, el caso es el siguiente:

no me unciona la busqueda aqui:
2003-09-30 00:00:00.000 campo con nombre fecha
para este utlizo la sentencia SELECT * FROM BTOEXCCANTODOS WHERE convert
(varchar,FECHA, 111 ) = convert(varchar,getdate(),111)


y el otro 2003-03-29 10:10:25.000 campo con nombre oadatime
SELECT * FROM OPTAUDIT WHERE convert (varchar,OADATETIME, 111 ) =
convert(varchar,getdate(),111)



y aqui funciona la busqueda

He intendado con el cast pero no ha sido posible.

Gracias por su colaboracion

Respuesta Responder a este mensaje
#2 Carlos M. Calvelo
19/06/2008 - 00:47 | Informe spam
Hola Alejandro,

On 18 jun, 23:37, Alejandro Mesa
wrote:

Si tu consulta trata de buscar todas las filas cuya fecha es igual a la
fecha corriente, sin importar el tiempo, entonces debes usar el patron:

...
where
    columna_fecha >= dateadd(day, datediff(day, 0, getdate()), 0)
    and columna_fecha < dateadd(day, datediff(day, 0, getdate()) + 1, 0)




Interesante.
Y con conversión implícita en vez de dateadd()?

...
where
columna_fecha >= datediff(day,0,getdate()) and
columna_fecha < datediff(day,-1,getdate())

(Nunca lo he usado así)

Saludos,
Carlos
Respuesta Responder a este mensaje
#3 Alejandro Mesa
20/06/2008 - 00:53 | Informe spam
Carlos,

Ese número debera ser convetido implicitamente a fecha y segun la formula
debe ser lo mismo. Lo unico extra es que yo lo convierto explicitamente
usando la funcion daeteadd, pero a la final el resultado debe ser el mismo.
El tipo de data datetime tiene mayor precedencia que el int, asi que ese #
sera convertido a datetime y como esta basado en la diferencia con el primer
dia, que es 0, debera dar el mismo resultado.

SELECT
1
WHERE
GETDATE() > DATEDIFF(DAY, 0, GETDATE())
AND GETDATE() < DATEDIFF(DAY, -1, GETDATE())
GO



AMB


"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 18 jun, 23:37, Alejandro Mesa
wrote:
>
> Si tu consulta trata de buscar todas las filas cuya fecha es igual a la
> fecha corriente, sin importar el tiempo, entonces debes usar el patron:
>
> ...
> where
> columna_fecha >= dateadd(day, datediff(day, 0, getdate()), 0)
> and columna_fecha < dateadd(day, datediff(day, 0, getdate()) + 1, 0)
>

Interesante.
Y con conversión implícita en vez de dateadd()?

...
where
columna_fecha >= datediff(day,0,getdate()) and
columna_fecha < datediff(day,-1,getdate())

(Nunca lo he usado así)

Saludos,
Carlos

Respuesta Responder a este mensaje
#4 Carlos M. Calvelo
20/06/2008 - 11:28 | Informe spam
Hola Alejandro,

On Jun 20, 12:53 am, Alejandro Mesa
wrote:
Carlos,

Ese número debera ser convetido implicitamente a fecha y segun la formula
debe ser lo mismo. Lo unico extra es que yo lo convierto explicitamente
usando la funcion daeteadd, pero a la final el resultado debe ser el mismo.



Ya, ya entendí. Lo que pasa es que al leerlo uno se pregunta:
"Y para qué hace un dateadd() para sumar 0?" y después uno se
dá cuenta de que es solo por la conversión.
Entonces, haciendo esa conversión explícita, me parece mas legible:

where
columna_fecha >= convert(datetime,datediff(day,0,getdate())) and
columna_fecha < convert(datetime,datediff(day,-1,getdate()))

No es por ser quisquilloso. Es por lo de que muchos 'abracadabras'
de estos en el código no ayudan a la hora tratar de entender el
códico de otros (o el de uno mismo, después de un par de meses).

Saludos,
Carlos
Respuesta Responder a este mensaje
#5 Alejandro Mesa
21/06/2008 - 00:00 | Informe spam
Carlos,

No es por ser quisquilloso. Es por lo de que muchos 'abracadabras'
de estos en el código no ayudan a la hora tratar de entender el
códico de otros (o el de uno mismo, después de un par de meses).



Preguntando se llega a Roma, right?

Estoy de acuerdo contigo, algunas veces esos trucos no son leibles. Seria
bueno que la misma compañia, en este caso Microsoft, incluyera en la libreria
unas cuantas funciones que son de uso comun.

En la version 2008 tenemos un tipo de dato tipo "fecha", el cual no incluye
tiempo. Asi que podemos escribir:

...
where
columna_fecha >= cast(getdate() as date)
and columna_fecha < cast(getdate() + 1 as date)


AMB


"Carlos M. Calvelo" wrote:

Hola Alejandro,

On Jun 20, 12:53 am, Alejandro Mesa
wrote:
> Carlos,
>
> Ese número debera ser convetido implicitamente a fecha y segun la formula
> debe ser lo mismo. Lo unico extra es que yo lo convierto explicitamente
> usando la funcion daeteadd, pero a la final el resultado debe ser el mismo.

Ya, ya entendí. Lo que pasa es que al leerlo uno se pregunta:
"Y para qué hace un dateadd() para sumar 0?" y después uno se
dá cuenta de que es solo por la conversión.
Entonces, haciendo esa conversión explícita, me parece mas legible:

where
columna_fecha >= convert(datetime,datediff(day,0,getdate())) and
columna_fecha < convert(datetime,datediff(day,-1,getdate()))

No es por ser quisquilloso. Es por lo de que muchos 'abracadabras'
de estos en el código no ayudan a la hora tratar de entender el
códico de otros (o el de uno mismo, después de un par de meses).

Saludos,
Carlos

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida