Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-03-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Gracias a todos por las rspuestas. Voy por partes. En la propuesta de roman no entiendo lo de multiplicar por 31 el mes. En todo caso ¿No sría más lógico multiplicarlo por 100? Desa forma se formarían series desde 101 (1 de enero) al 1231 (31 de diciembre). Esta no se me había ocurrido y la tengo que probar.

La de marcoszorrilla es similar a la primera que me sugirieron pero, al igual que aquella, sólo extrae una fecha de todas las posibles.
Responder Con Cita
  #2  
Antiguo 02-03-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Confirmado. El código ha quedado así:
Código SQL [-]
SELECT * FROM 'Personas.db' 
WHERE 100 * EXTRACT(MONTH FROM F_nacimiento) + EXTRACT(DAY FROM F_nacimiento) BETWEEN 100 * Mes_ini + Dia_ini AND 100 * Mes_fin + Dia_fin AND F_nacimiento != '12/30/1899'

Esa fecha final es porque en las tablas Paradox si una fecha se graba vacía por defecto pone el 30 de diciembre de 1788.

Última edición por Casimiro Noteví fecha: 02-03-2012 a las 10:02:10.
Responder Con Cita
  #3  
Antiguo 02-03-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Angel.Matilla Ver Mensaje
En la propuesta de roman no entiendo lo de multiplicar por 31 el mes. En todo caso ¿No sría más lógico multiplicarlo por 100?
Bueno, en realidad puedes multiplicarlo por 1000 o por 1000000. La idea es simplemente "agrandar" la parte del mes lo suficiente como para que la parte del día no domine en la comparación. De hecho, originalmente usé 100, pero en realidad 31 es suficiente. Es más, creo que 30 es suficiente

De todas formas, recuerda que este método va a fallar si, por ejemplo, quieres saber todos los cumpleaños entre el 28 de ciciembre y el 4 de enero.

// Saludos
Responder Con Cita
  #4  
Antiguo 02-03-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 27
Delphius Va camino a la fama
Para las fechas que "cruzan" de año, como el ejemplo de roman no queda más remedio que armar una condición del tipo:

Código SQL [-]
((:Mes >= Mes_ini) AND (:Mes <= 12)) OR ((:Mes >= 1) AND (:Mes <= Mes_fin))

De este modo se mostrarán aquellas fechas que sean desde el mes "inicial" hasta diciembre inclusive, más las fechas que sean de enero hasta la fecha "final".

Un criterio similar se puede, y debe, llevar a cabo con el tema los días "cruzados"

La cuestión es que ahora la lógica pasa por armar esta condición aplicando una evaluación previa de si el mes final es menor al inicial; y lo mismo aplica para el día.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #5  
Antiguo 02-03-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Bueno, se supone que todo mes es menor o igual que 12 y mayor o gual que 1, por lo que esos dos condicionales sobrarían.

Lo de la evaluación previa, creo que podemos hacerla en la misma consulta comparando los parámetros en sí:

Código SQL [-]
select * from personas
where
  ( 
    (100*:mi + :di < 100*:mf + :df) and
    (
      (100*:mi + :di < 100*extract(month from fecha) + extract(day from fecha)) and
      (100*extract(month from fecha) + extract(day from fecha) < 100*:mf + :df)
    )
  )
  or
  (
    (100*:mi + :di > 100*:mf + :df) and
    (
      (100*:mi + :di < 100*extract(month from fecha) + extract(day from fecha)) or
      (100*extract(month from fecha) + extract(day from fecha) < 100*:mf + :df)
    )
  )

Un ejemplo de uso:

Código Delphi [-]
var
  mi, mf, di, df: Integer;

begin
  Query1.ParamByName('mi').AsInteger := MonthOf(DateTimePickerInicial.Date);
  Query1.ParamByName('di').AsInteger := DayOf(DateTimePickerInicial.Date);

  Query1.ParamByName('mf').AsInteger := MonthOf(DateTimePickerFinal.Date);
  Query1.ParamByName('df').AsInteger := DayOf(DateTimePickerFinal.Date);

  Query1.Open;
end;

Conste que puse 100 para que no se extrañen .

No la he probado del todo pero creo que funciona salvo porque me falta el caso de que las fechas inicial y final sean iguales, pero no debe ser mayor problema.

// Saludos
Responder Con Cita
  #6  
Antiguo 03-03-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
¿Ves? Eso no se me había ocurrido, lo de "agrandar" la parte del mes usando una cifra diferente de 100.

El otro problema, el del salto de año (p.ej.: del 28/12/2012 al 04/01/2013) en parte lo soluciono no permitiendo al operador que introduzca fechas superiores al 31 de diciembre del año en curso, pero es cierto que no es la mejor solución y hasta que vea otra opción...
Responder Con Cita
  #7  
Antiguo 05-03-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Angel.Matilla Ver Mensaje
El otro problema, el del salto de año (p.ej.: del 28/12/2012 al 04/01/2013)
Bueno, se supone que la última consulta que puse resuelve eso. ¿La has probado?

// Saludos
Responder Con Cita
  #8  
Antiguo 07-03-2012
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Bueno, se supone que la última consulta que puse resuelve eso. ¿La has probado?

// Saludos
Sí, lo probé pero con el código que puse yo también pude resolverlo. Gracias Roman.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Encontrar importe Waldo Varios 2 14-01-2010 19:39:08
Donde encontrar b0rn OOP 3 03-04-2007 01:05:22
Cómo encontrar Roilo Varios 1 07-12-2005 15:48:12
Encontrar la paz interior santana Humor 3 14-06-2004 18:47:35
encontrar el siguiente en ado jzginez Conexión con bases de datos 1 21-05-2004 11:42:08


La franja horaria es GMT +2. Ahora son las 22:21:59.


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