Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
¿y si utilizas "between" no funciona?

Código Delphi [-]
with unQuery do begin
..
 SQL.Add('Where Fecha between :FechaAyer and :FechaManana');
...
ParamByName('FechaManana').AsDateTime := MI_FECHA+1;
ParamByName('FechaAyer').AsDateTime := MI_FECHA-1;
...
__________________

Responder Con Cita
  #2  
Antiguo 24-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Yo pasaría las horas por parámetros también (es más elefante).

Siempre que deciis que no os da problema usais un formato de fecha americano, y ese es el que toma por defecto los motores (pero podría cambiar).

Al usar parámetros nos quitamos de problemas.

Otro posible problema, es que AsDate también puede estar pasando la hora (ya que Tdate y Tdatetime viene a ser lo mismo), aconsejo usar:
Código Delphi [-]
ParamByName('FechaAyer').AsDate := trunc(MI_FECHA-1);
     ParamByName('FechaHoy').AsDate  := trunc(MI_FECHA);
     ParamByName('FechaMana').AsDate := trunc(MI_FECHA+1);
como sabemos, un Datetime es un Extended que guarda la hora en la parte fracionaria, quitándola, nos aseguramos de no pasarle hora ninguna en ese parámetro.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 24-11-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Cita:
Empezado por ContraVeneno Ver Mensaje
¿y si utilizas "between" no funciona?

Código Delphi [-]with unQuery do begin .. SQL.Add('Where Fecha between :FechaAyer and :FechaManana'); ... ParamByName('FechaManana').AsDateTime := MI_FECHA+1; ParamByName('FechaAyer').AsDateTime := MI_FECHA-1; ...
Hola ContraVeneno, el problema no es la fecha, sino que debe recoger solo desde las 21:00:00 de ayer hasta las 00:00:00 de mañana (era parte de la condición del ejemplo)

Saludos
salvica
Responder Con Cita
  #4  
Antiguo 24-11-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Cita:
Empezado por salvica Ver Mensaje
Hola ContraVeneno, el problema no es la fecha, sino que debe recoger solo desde las 21:00:00 de ayer hasta las 00:00:00 de mañana (era parte de la condición del ejemplo)

Saludos
salvica
ya, vaya:

Código Delphi [-]
Var FechaAyer, FechaManana: TDateTime;
 ...
 FechaAyer := EncodeDateTime(YearOf(Fecha-1), MonthOf(Fecha-1), DayOf(Fecha-1), 21, 00, 00);
...
 SQL.Add('Where Fecha between :FechaAyer and :FechaManana');
 ParamByName('FechaAyer').AsDateTime := FechaAyer
 ...
__________________

Responder Con Cita
  #5  
Antiguo 24-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
...pero en la hora 0:00:00 ya ha cambiado la fecha, es una lata andar con fecha de hoy, de mañana, etc...

No te vale algo así: fecha = :fecha and (hora between :hora1 and hora2)
En hora1 le pasas 21:00 (formato time), y en hora2 le pasas 23:59:59.999

Así usas un parámetro de fechas menos.


Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 24-11-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Perdonar la tardanza, estaba probando lo anterior
Código SQL [-]
       SQL.Add( ' WHERE fecha BETWEEN :FechaAyer AND :FechaManana' );
       SQL.Add( '   AND DATE_FORMAT(hora, "%i:%s")="00:00"' );
       SQL.Add( ' ORDER BY clave' );
       ParamByName('FechaAyer').AsDateTime   := EncodeDateTime(YearOf(FECHA-1), MonthOf(FECHA-1), DayOf(FECHA-1), 23, 0, 0, 0);
       ParamByName('FechaManana').AsDateTime := EncodeDateTime(YearOf(FECHA+1), MonthOf(FECHA+1), DayOf(FECHA+1),  0, 0, 0, 0);
No funciona , me coge los tres días enteros
Responder Con Cita
  #7  
Antiguo 24-11-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
mmmkelas, pues entonces no entendí lo que estas buscando... déjame darle otra leída.
__________________

Responder Con Cita
  #8  
Antiguo 24-11-2008
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Mira contraveneno, tengo unas tablas que contienen datos recogidos de unos sensores, por lo que vienen en formato Fecha, Hora, Valor y Calidad, por eso lo de consultar en unas horas determinadas. Parece ser que con el ParamByName se resuelve (o lo he reuelto) así:
Código SQL [-]
       SQL.Add( ' WHERE (    (fecha = :FechaAyer   AND HOUR(hora)=21)' );
       SQL.Add( '         OR (fecha = :FechaHoy)' );
       SQL.Add( '         OR (fecha = :FechaManana AND HOUR(hora)= 0)' );
       SQL.Add( '       ) AND DATE_FORMAT(hora, "%i:%s")="00:00"' );
       SQL.Add( ' ORDER BY clave' );
       ParamByName('FechaAyer').AsDateTime   := Trunc(FECHA_PRESION-1);
       ParamByName('FechaHoy').AsDateTime    := Trunc(FECHA_PRESION);
       ParamByName('FechaManana').AsDateTime := Trunc(FECHA_PRESION+1);
La parte DATE_FORMAT(hora, "%i:%s")="00:00"' ) es la que me deja cojer los valores de las "horas en punto"

Gracias a todos
Salvica
Responder Con Cita
  #9  
Antiguo 24-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Editaaaaaado otra vez:

Pues entre tu última repuesta y esto, creo que vamos volando

Sí que hay que darle vueltas al tema jeje.
Código Delphi [-]
 SQL.Add( ' WHERE ( ');
  SQL.Add( '         ((fecha between :FechaAyer and :FechaAyer + 1)  AND (Hour(hora) between 21 and 23))' ); //ayer y hoy entre las 21 y 23
  SQL.Add( '         OR ((fecha between :FechaAyer +1 and FechaAyer +2) AND (HOUR(hora)= 0))' ); // hoy y mañana a las 0:00
  SQL.Add( '       )');
 SQL.Add( ' AND (DATE_FORMAT(hora, "%i:%s")="00:00")');
 SQL.Add( ' ORDER BY psensor.clave' );
   ParamByName('FechaAyer').AsDate := trunc(MI_FECHA);

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 24-11-2008 a las 18:57:02. Razón: no pillaba la fecha de hoy de las 0:00
Responder Con Cita
Respuesta



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
ParamByName en ADO silviodp Tablas planas 5 12-01-2008 12:50:01
Problema con Parambyname y dataset Rockin Firebird e Interbase 4 12-10-2007 00:10:47
datetimerpicker-parambyname-SQL server 2000 DarkGirl MS SQL Server 13 15-08-2007 23:39:09
Problemas con ParamByName Memo ramonibk MS SQL Server 2 14-09-2004 13:15:26
Insert y parambyname Dantael SQL 1 17-11-2003 08:50:24


La franja horaria es GMT +2. Ahora son las 23:17:24.


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
Copyright 1996-2007 Club Delphi