Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta Aproximada (https://www.clubdelphi.com/foros/showthread.php?t=81297)

ASUNCION 31-10-2012 17:27:45

Consulta Aproximada
 
Saludos!

Necesito consultar un registro en una tabla por una fecha y si no existe esta fecha que me devuelva el registro con la fecha proxima a la especificada.

Trabajo con delphi 7 y sql server 2005.

Gracias por adelantado...

roman 31-10-2012 18:01:09

Desde luego, tienes primero que definir lo que entiendes por fechas próximas. Por ejemplo, esta consulta

Código SQL [-]
select * from tabla where datediff(DAY, fecha, :fecha) < 5

te devolvería los registros que disten menos de cinco días de la fecha indicada en el parámetro :fecha.

Si quieres el más cercano (en días) podrías intentar esto:

Código SQL [-]
select TOP 1 *, datediff(DAY, fecha, :fecha) as diferencia
from tabla
order by diferencia

// Saludos

ElDioni 31-10-2012 18:03:06

Hola,

asi, de primeras, se me ocurre hacer dos consultas, yo trabajo con Adoquerys.

Código Delphi [-]
Adoquery1.Close;
Adoquery1.SQL.Text:='SELECT * FROM tabla where fecha=#17/01/2012#';
Adoquery1.Open;
if Adoquery1.IsEmpty then
  begin
    Adoquery1.Close;
    Adoquery1.SQL.Text:='SELECT * FROM tabla where fecha<=#17/01/2012# ORDER BY fecha DESC';
    Adoquery1.Open;
  end;
showmessage(Adoquery1.FieldByName('Codigo').AsString);

Espero que te sirva de ayuda.

Saludos.

ElDioni 31-10-2012 18:07:31

Bueno, se me adelantó roman.

Además con la opción que te indica roman te muestra la más cercana tanto por arriba como por abajo, en mi propuesta te muestra la más cercana pero siempre inferior a la que introduces como parametro.

Saludos.

roman 31-10-2012 18:12:47

Cita:

Empezado por ElDioni (Mensaje 448436)
Además con la opción que te indica roman te muestra la más cercana tanto por arriba como por abajo

Ahora que lo mencionas, veo que datediff devuelve positivo o negativo según si la primera fecha es anterior a la segunda o no; así que habrá que tener cuidado con eso, porque la menor podría ser la más lejana :eek:

Habría que añadir una condición de que datediff > 0.

// Saludos

ecfisa 31-10-2012 18:15:16

Hola.

En Firebird haría la consulta así.

Igual o próximo anterior:
Código SQL [-]
SELECT FIRST 1 * FROM TABLA
WHERE FECHA  <= :FECHA
ORDER BY FECHA DESC

Igual o próximo posterior:
Código SQL [-]
SELECT FIRST 1 * FROM TABLA
WHERE FECHA  >= :FECHA
ORDER BY FECHA

Por lo que indico roman, creo que el equivalente en MS SQL Server del FIRST 1 de Firebird, es TOP 1, así que tendrías que hacer el reemplazo.

Saludos.

roman 31-10-2012 18:19:48

Cita:

Empezado por ecfisa (Mensaje 448438)
Por lo que indico roman, creo que el equivalente en MS SQL Server del FIRST 1 de Firebird, es TOP 1

En realidad, lo indicó el w3schools :D

Creo que tu consulta es más eficiente ya que restringes los registros resultantes desde el select.

// Saludos

ElDioni 31-10-2012 18:41:47

Bueno, lo que si es cierto es que sigo en cabeza con la peor opción. :D

Saludos.

roman 31-10-2012 18:46:21

Ja, ja. No lo veas así. Tu opción y la de ecfisa son esencialmente iguales. La diferencia es que él selecciona el primer registro desde la consulta, evitando así el viaje de registros innecesarios hacia el cliente.

// Saludos

ASUNCION 31-10-2012 20:20:37

Consulta Sql
 
Tengo suficiente opciones escogeré la mejor...


La franja horaria es GMT +2. Ahora son las 15:32:58.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi