PDA

Ver la Versión Completa : ¿como obtener la fecha mas reciente y la mas antigua?


JXJ
15-10-2011, 05:31:16
hola

tengo el problema de obtener la fecha mas reciente y mas antigua de un
listado de productos.

con firebird que sentencia se usa.
los campos son datetime.

aunque tambien tengo otros campos de tipo date.


encontre que con esto obtengo el registro mas reciente.

el primer registro indicado por el numero 1

select first 1 id, numerodeserie, validodesde from productos;

pero como obtengo el mas antiguo?


este no me sirve

select min(validodesde ) from productos por que solo me da la fecha y yo quiero aparte el id , numerodeserie



esta bien o ando haciendo algo mal hay mejores formas??

JXJ
15-10-2011, 05:45:24
creo que esta puede servirme
select id, min(validodesde) as fechaantigua from certificado
group by 1

el problema es qeu si tengo varios registros con la misma fecha me los trae todos.
el otro problema es que solo pueod poner 2 campos

si la pongo asi.

select id, ACTIVO, min(validodesde) as fechaantigua from certificado
group by 1

me da el error

Engine Error (code = 335544569):
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

SQL Error (code = -104):
Invalid token.

¿cual pondria como agregate ?

D-MO
15-10-2011, 05:52:22
desconozco firebird, pero ¿porqué haces group by 1 en lugar de id y/o ACTIVO?

ecfisa
15-10-2011, 08:11:59
Hola JXJ.

Probá de este modo:

SELECT FIRST 1 T1.ID_TABLA, T1.VALIDODESDE, T1.ACTIVO,
FROM TABLA T1
WHERE T1.VALIDODESDE = (SELECT MIN(T2.VALIDODESDE) FROM TABLA T2)
GROUP BY T1.ID_TABLA, T1.VALIDODESDE, T1.ACTIVO


Saludos.

ecfisa
15-10-2011, 08:27:04
desconozco firebird, pero ¿porqué haces group by 1 en lugar de id y/o ACTIVO?
Hola D-MO.

Si bién Firebird permite usar números para hacer referencia a columnas, no es aconsejable ya que es una técnica obsoleta. Se recomienda el uso de sinónimos en su lugar.

Con el uso de números:

SELECT ID_TABLA, NUM1 - NUM2
FROM TABLA
ORDER BY ID_TABLA, 2


Recomendada:

SELECT ID_TABLA, NUM1 - NUM2 AS DIFERENCIA
FROM TABLA
ORDER BY ID_TABLA, DIFERENCIA


Un saludo. :)

D-MO
15-10-2011, 17:41:14
Gracias ecfisa por el comentario, a decir verdad algo así suponía pero no veo la razón de utilizarlo así ya que es mas legible utilizar los nombres de los campos o alias, tal y como comentas.

Ahora, con respecto a esta consulta:

SELECT FIRST 1 T1.ID_TABLA, T1.VALIDODESDE, T1.ACTIVO,
FROM TABLA T1
WHERE T1.VALIDODESDE = (SELECT MIN(T2.VALIDODESDE) FROM TABLA T2)
GROUP BY T1.ID_TABLA, T1.VALIDODESDE, T1.ACTIVO

Pregunto, ¿Porqué anidar el min()?

Saludos.

guillotmarc
15-10-2011, 18:33:53
Hola.

Más reciente :

select first 1 id, numerodeserie, validodesde
from productos
order by validodesde descending;

Mas antiguo :

select first 1 id, numerodeserie, validodesde
from productos
order by validodesde ascending;

Es la misma consulta, cogiendo el primer registro, ordenado por fecha de mayor a menor, o bien de menor a mayor.

Saludos.

ecfisa
15-10-2011, 18:51:25
Pregunto, ¿Porqué anidar el min()?

Creo que fué por que eran pasadas las 4 de la mañana (tengo que entregar un trabajo el lunes) y tenía las neuronas medio aletargadas... :D

Pero yá Marc, le ha dado una excelente respuesta.

Un saludo.

JXJ
15-10-2011, 22:31:12
el

group by 1

y el min()
lo encontre en buscando en internet..
en lugar de last.

voy a revisarlos a ver que tal me queda. muchas gracias. a todos.