Problema tonto (con las fechas)

14/11/2003 - 12:20 por Emilio Garcia Loeda | Informe spam
Buenas

Disculpas por repreguntar un problema tan recurrente, pero tras leer los
"post" no he encontrado la solución al problema que tengo.

Tengo una tabla con de la cual deseo optener el numero de registros por
dia , al campo "fechain" es de tipo datetime, cuando ejecuto la siguiente
consulta ...

select count(convert(varchar(10),fechain,103)),
convert(varchar(10),fechain,103)
from telefonos
where convert(varchar(10),fechain,103)
BETWEEN convert(varchar(10),getdate(),103)
and convert(varchar(10),getdate()-90,103)
group by convert(varchar(10),fechain,103)
order by convert(varchar(10),fechain,103)

optengo los datos ...

121 16/05/2001
223 16/04/2003
131 16/01/2002
121 15/02/2002
88 16/08/2001
149 15/11/2001
211 15/04/2003
293 15/10/2002
86 15/09/2001
172 15/10/2003
30 15/06/2001
120 15/01/2002
..
..
..

Como se puede comprobar estan realmente no ordenador (supongo que es por
utilizar el "convert".

He utilizado cast y convert con el codigo de siglo 113, con resultados
totalmente erroneos.

Existe una forma correcta de realizar esta consulta sobre campos datetime
y optener la consulta ordenada

Gracias por todo

Emilio G. Loeda
www.loeda.net

Preguntas similare

Leer las respuestas

#1 Accotto Maximiliano D.
14/11/2003 - 13:43 | Informe spam
sin probarlo pero prueba asi:

order by fechain (sin el convert)

un saludo



Accotto Maximiliano Damian
Fundicion San Cayetano S.A
4002 - 4010
Gerente de Sistemas

"Emilio Garcia Loeda" escribió en
el mensaje news:
Buenas

Disculpas por repreguntar un problema tan recurrente, pero tras leer los
"post" no he encontrado la solución al problema que tengo.

Tengo una tabla con de la cual deseo optener el numero de registros por
dia , al campo "fechain" es de tipo datetime, cuando ejecuto la siguiente
consulta ...

select count(convert(varchar(10),fechain,103)),
convert(varchar(10),fechain,103)
from telefonos
where convert(varchar(10),fechain,103)
BETWEEN convert(varchar(10),getdate(),103)
and convert(varchar(10),getdate()-90,103)
group by convert(varchar(10),fechain,103)
order by convert(varchar(10),fechain,103)

optengo los datos ...

121 16/05/2001
223 16/04/2003
131 16/01/2002
121 15/02/2002
88 16/08/2001
149 15/11/2001
211 15/04/2003
293 15/10/2002
86 15/09/2001
172 15/10/2003
30 15/06/2001
120 15/01/2002
..
..
..

Como se puede comprobar estan realmente no ordenador (supongo que es por
utilizar el "convert".

He utilizado cast y convert con el codigo de siglo 113, con resultados
totalmente erroneos.

Existe una forma correcta de realizar esta consulta sobre campos datetime
y optener la consulta ordenada

Gracias por todo

Emilio G. Loeda
www.loeda.net

Respuesta Responder a este mensaje
#2 dbuendiab
14/11/2003 - 23:14 | Informe spam
select count(convert(varchar(10),fechain,103)),
convert(varchar(10),fechain,103)
from telefonos
where convert(varchar(10),fechain,103)
BETWEEN convert(varchar(10),getdate(),103)
and convert(varchar(10),getdate()-90,103)
group by convert(varchar(10),fechain,103)
order by convert(varchar(10),fechain,103)



¡Qué manía con el Convert!

Por qué no haces ...

Select Count(*) Contador,
Convert(varchar(10),fechain,103) FechaIn
From telefonos
Where fechain BETWEEN getdate() AND DateAdd( day, -90, getdate() )
Group By fechain
Order by fechain

... simplemente? SQL Server sabe manejarse con las fechas, las dos
únicas utilidades de Convert() son

a) formatear la fecha para la presentación en el conjunto de columnas
del SELECT

Select Convert( varchar(20), GetDate(), 113 ) As Fecha

b) Realizar algunas operaciones cómodas, por ejemplo para obtener el
primer día del mes de la fecha (formato 108: yyyymmdd)

Convert( datetime, Convert( varchar(6), GetDate(), 108 ) + '01' )

o el último día del mes de una fecha:

DateAdd( day, -1, -- Restar un día
Convert( datetime, -- de una fecha montada a
partir
Convert( varchar(6), -- del primer día del
DateAdd( month, 1, GetDate() ), -- mes siguiente
108
) + '01'
)
)

c) En algunos casos francamente malos para forzar un join con un campo
de fecha en formato texto (en bases de datos antiguas).

Saludos,

Diego Buendia
Barcelona, Spain
Respuesta Responder a este mensaje
#3 Emilio Garcia Loeda
17/11/2003 - 10:42 | Informe spam
Gracias pero no me vale, te explico resulta que el campo fechain tiene el
formato de fecha y hora, de hay que abuse del odiado "convert()".


Estoy trabajando con una aplicación heredara con un nefasto diseño de
tablas, y todos los campos de fecha no son simples (solo fecha) si no que
tienen fecha y hora, y claro tengo que utilizar el maldito convert.

si ejecuto la consulta que tu me comentas optengo los siguiente (solo
escribo unas cuentas lineas..)

Contador FechaIn
1 01/02/2002
1 01/02/2002
1 01/02/2002
1 01/02/2002
1 01/02/2002
1 01/02/2002
1 01/02/2002
1 01/02/2002
1 01/02/2002
1 01/02/2002

(10 filas afectadas)

Como puedes comprobar al agrupar por FechaIn, y ser este un campo
combinado agrupa no solo por la fecha sino por la hora.

Asi que estamos en el mismo punto que antes y es un problema, estoy algo
"quemado"

SAludos

(Diego Buendia) wrote in
news::

select count(convert(varchar(10),fechain,103)),
convert(varchar(10),fechain,103)
from telefonos
where convert(varchar(10),fechain,103)
BETWEEN convert(varchar(10),getdate(),103)
and convert(varchar(10),getdate()-90,103)
group by convert(varchar(10),fechain,103)
order by convert(varchar(10),fechain,103)



¡Qué manía con el Convert!

Por qué no haces ...

Select Count(*) Contador,
Convert(varchar(10),fechain,103) FechaIn
From telefonos
Where fechain BETWEEN getdate() AND DateAdd( day, -90, getdate() )
Group By fechain
Order by fechain

... simplemente? SQL Server sabe manejarse con las fechas, las dos
únicas utilidades de Convert() son

a) formatear la fecha para la presentación en el conjunto de columnas
del SELECT

Select Convert( varchar(20), GetDate(), 113 ) As Fecha

b) Realizar algunas operaciones cómodas, por ejemplo para obtener el
primer día del mes de la fecha (formato 108: yyyymmdd)

Convert( datetime, Convert( varchar(6), GetDate(), 108 ) + '01' )

o el último día del mes de una fecha:

DateAdd( day, -1, -- Restar un día
Convert( datetime, -- de una fecha montada a
partir
Convert( varchar(6), -- del primer día del
DateAdd( month, 1, GetDate() ), -- mes siguiente
108
) + '01'
)
)

c) En algunos casos francamente malos para forzar un join con un campo
de fecha en formato texto (en bases de datos antiguas).

Saludos,

Diego Buendia
Barcelona, Spain
Respuesta Responder a este mensaje
#4 dbuendiab
17/11/2003 - 16:13 | Informe spam

>> select count(convert(varchar(10),fechain,103)),
>> convert(varchar(10),fechain,103)
>> from telefonos
>> where convert(varchar(10),fechain,103)
>> BETWEEN convert(varchar(10),getdate(),103)
>> and convert(varchar(10),getdate()-90,103)
>> group by convert(varchar(10),fechain,103)
>> order by convert(varchar(10),fechain,103)
>



Vale, entendido, el problema es que al hacer convert la cadena
resultante no ordena bien y si usas fechain te dice que es un campo
que no pertenece a la agrupación. Solución: usa tu consulta (sin el
order by) como subconsulta
interior y ordena fuera de la misma:

Select a.fecha, a.contador
From (
Select Count( Convert( varchar(10), fechain, 103 ) ) contador,
Convert( varchar(10), fechain, 103 ) fecha
From telefonos
Where Convert( varchar(10), fechain, 103 )
Between Convert( varchar(10), fechain, 103 )
And Convert( varchar(10), getdate() - 90, 103 )
Group By Convert( varchar(10), fechain, 103 )
) a
Order By Cast( a.fecha As datetime )

A ver si ahora hemos acertado...

Saludos

Diego Buendia
Barcelona Spain
Respuesta Responder a este mensaje
#5 dbuendiab
17/11/2003 - 16:21 | Informe spam

>> select count(convert(varchar(10),fechain,103)),
>> convert(varchar(10),fechain,103)
>> from telefonos
>> where convert(varchar(10),fechain,103)
>> BETWEEN convert(varchar(10),getdate(),103)
>> and convert(varchar(10),getdate()-90,103)
>> group by convert(varchar(10),fechain,103)
>> order by convert(varchar(10),fechain,103)
>



Otra alternativa más sencilla: quitar la hora en la subconsulta y
trabajar el resto todo igual que en la tuya desde la consulta exterior



select dia, count(*) contador
from (
select cast( convert(varchar(10), fechain, 103 ) as datetime ) as
dia
from telefonos
) a
where dia >= DateAdd( day, -90, getdate() ) And dia <= getdate()
group by dia
order by dia asc



Saludos

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