Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

comparar horas en tabla access

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: comparar horas en tabla access Responder citando

Hola, quiero hacer una consulta SQL sobre una tabla access en la que comparo una hora cualquiera con la almacenada en la tabla. El problema es que la hora la tengo guardada dentro de un campo con formato fecha general (p.ej 15/06/2003 02:02:00) y no sé como extraer la hora. He probado a utilizar la función FormatDateTime y las fechas si me las compara, pero con la hora individualmente no lo he conseguido.
¿El problema es que no doy bien el formato de hora o que es necesario utilizar alguna funcion SQL para extraer la hora?

Espero haberme explicado,

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Que tal lycopersium,

Yo también he pasado por algo similar, solo que a mi no me interesaba comparar la hora.

En mi caso solo utilice DATE() para comparar la fecha con la tabla, esta función solo regresa la fecha, pero si quieres la hora utiliza NOW().

Ej.
Código:


if ( Now() == tablaCampoFecha->Value )
    ShowMessage("Iguales");
else
    ShowMessage("Diferentes");



Espero te sirva de algo.

Saludos, Raúl
Volver arriba
Mensaje    Asunto: Responder citando

Hola Raul. Gracias por la respuesta pero el problema es q la comparacion la tengo q realizar dentro de la consulta para filtrar los campos en una tabla. La duda está en como construir esa consulta. Por ejemplo, para la fecha hago esto:

Código:

AnsiString fecha=FormatDateTime("yyyy/mm/dd",Date());
//..
ADOQuery1->SQL->Add("SELECT * FROM Tabla WHERE    Fecha<#"+fecha+"#");
//..


Pero para la hora no funciona sustituyendo el String fecha por:
AnsiString hora=FormatDateTime("hh:nn:ss",Time());
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Que tal,

Aqui vamos de nuevo.

Me puse a leer un poco y al fin encontre lo que puede ser la forma de hacerlo.

Tengo un form, un componente TADOQuery y un botón.

Código:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString fecha =
     FormatDateTime("dd/mm/yyyy hh:mm:ss am/pm",
         StrToDateTime("12/05/2003 01:34:45 p.m."));

  ADOQuery1->Parameters->ParamByName("fecha")->Value = fecha;
  ADOQuery1->Open();
  if (!ADOQuery1->IsEmpty() )
  {
     ShowMessage("Encontrado");
  }
  else
     ShowMessage("No encontrado");

  ADOQuery1->Close();

}



Ahora te preguntaras en donde se declara la consulta SQL??

En la propiedad SQL (TStrings) debes agregar el siguiente código:

SELECT * FROM Tabla1 WHERE fecha = :fecha (segun mi ejemplo).

La parte :fecha significa que se trata de un parámetro, por lo tanto lo debes declarar en la propiedad Parameters y deberas configurar las propiedades (del parametro) Name = fecha, DataType = ftString y Value = "".

Observa que en el código del evento OnClick, antes de abrir la consulta se le asigna el valor al parámetro.

Saludos, Raúl
Volver arriba
Mensaje    Asunto: Responder citando

Gracias Raul nuevamente por tu tiempo. He probado el ejemplo que me pones y lo que realmente hace es comparar fechas y lo que quiero son las horas de las fechas.

Si tengo un campo Fecha/hora con formato: 19/06/03 23:34:45 y quiero conseguir todos los registros cuya hora sea menor que las 23:00:00 independientemente del dia, necesitaria extraer de alguna manera (en sql) la hora de ese campo que me almacena fecha+hora para poder compararla con la hora que quiero (23:00:00). La duda es más bien cómo sería esa consulta.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Una solución Responder citando

Hola, la verdad yo tuve un problema parecido al comparar las fechas... pero es lo mismo... mira yo hice lo siguiente:

Necesitaba guardar en la base de datos la fecha de creación de un documento, para ello hacía lo siguiente:

AnsiString hora1,fecha1;
TDateTime fecha;
fecha=Date(); /// Esta funcion te retorna la fecha actual;
fecha1=fecha.formatString("dd/mm/yyyy"); // esto te retorna la fecha en el formato especificado.
luego ocupaba una funcion que me convertia la fecha del formato dd/mm/yyyy a yymmdd, osea, una funcion que recibia un AnsiString, y me retornaba otro con uuna fecha yymmdd, por ejemplo le entregaba 12/02/2003 y me retornaba un 20030212, esto para guardar la fecha como NUMERICO en la base de datos.
de la misma manera te puedes hacer una funcion similar para la hora, osea,
TDateTime hora;
hora=Time();
hora1=hora.formatString("hh:nn:ss");
y luego utiliza esta funcion:

AnsiString conviertehora(AnsiString hora){
AnsiString retorno="";
retorno=hora.SubString(1,2)+hora.SubString(4,2)+hora.SubString(7,2);
return(retorno);
}

luego la cadena pa insertar va a ser

SQL="insert into tutabla values("+hora+", ......)";

y la comparación no te ocasionara problemas porque estarás comparando números enteros... jejeje.

Bueno, espero haberte ayudado, soy medio enredado pa' explicar, saluos, leonardo caldera.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola leonardo. Esa solución seguro que funciona. Una forma más rápida es poner el campo fecha como un numero doble y guardar directamente el casting de fecha-hora a float: (double)Now(); Entonces, como tu dices lo único que se hacen es comparar números.

El problema es que los datos no los guardo desde builder, sino que ya están ahi, en ese campo fecha-hora, y mi programa lo único que hace es leerlos. Así que mi hora de comparación la puedo tener en cualquier formato, pero la comparación en sql la tengo que hacer con un campo fecha-hora (a menos que exista alguna funcion en sql que pase la hora a numero...).

En fin..

Muchas gracias por la atención Smile
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Nuevamente,

Siguiendo investigando encontre una función de SQL que te puede solucionar el probrema.

Siguiendo el mismo ejemplo que te puse en mi mensaje anterior lo que cambia es la cadena de la consulta.

Ej.

SELECT * FROM Tabla1 where Mid([fecha],12, Cool <= :hora

La función Mid funciona de la misma forma que SubStr, extrae tantos caracteres como necesites desde una posición especifica, por lo tanto para extraer los datos de la hora nos posicionamos en el caracter numero 12 y a partir de ahi 8 caracteres (ej. 12:03:00 ).

Nota: El valor :hora es un parametro.

Lo he probado y me ha funcionado.

Espero que ahora si puedas resolver tu problema

Saludos, Raúl
Volver arriba
Mensaje    Asunto: Responder citando

Por lo de la carita,

Código:


SELECT * FROM Tabla1 where Mid( [fecha], 12, 8) <= :hora

Volver arriba
Mensaje    Asunto: Responder citando

Shocked Funciona!!! Very Happy La verdad es q no se como agradecertelo, pensé q esta cosa tan aparentemente simple no la iba a solucionar nunca.

Bueeeno, ¡!muchas gracias Raul, te debo 1 Wink
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.