Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   problemas con campo timestamp (https://www.clubdelphi.com/foros/showthread.php?t=21723)

Citlalli 25-05-2005 22:26:15

problemas con campo timestamp
 
Hola, mi problema es que tengo un campo string y ahi guardo la hora mediante el código:

Add('INSERT INTO Agenda (');
Add('Hora)');
Add('Values (');
Add(sep + FormatDateTime('h:mm am/pm',Time) + sep + ')');

la constante sep = #39 para poner las comillas

el problema es que una vez insertada la informacion, no puedo ordenar el query de consulta por este campo(me lo ordena mal), asi que le cambie el tipo a timestamp, pero no encuentro como guardarlo, me da errores, si alguien me pudiera ayudar se los voy a agradecer.

saludos

Lepe 26-05-2005 15:35:06

Cita:

Empezado por Ayuda Delphi
Unit

SysUtils

Category

date/time routines

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;

Description

Call TimeStampToDateTime to convert a TTimeStamp value into a TDateTime value. TTimeStamp values represent time as separate date and time values, where the date is the number of calendar days since the start of the current calendar (that is, January 1, 0001 would have a value of 1), and time is the number of milliseconds since midnight. TDateTime values represent time as the number of days (including fractional days) that have elapsed since 12:00 am on December 30, 1899.

Unit

SysUtils

Category

date/time routines

function DateTimeToTimeStamp(DateTime: TDateTime
): TTimeStamp;

Description

Call DateTimeToTimeStamp to convert a TDateTime value into a TTimeStamp value.

Deberías usar TimeStampToDateTime para rescatar valores de la base de datos y mostrarlo en un TdatetimePicker (por ejemplo)

Deberías usar DateTimeToTimeStamp para convertir una fecha y guardarla en la base de datos.

PosData: olvidate de la comilla simple cuando trabajes con TimeStamp.

Un saludo

Citlalli 31-05-2005 07:12:09

Gracias lepe, lo voy a probar y te aviso

saludos

Citlalli 02-06-2005 01:17:58

les voy a explicar paso a paso mi problema, hay que tomar en cuenta que utilizo interbase 6 (el que viene con delphi 6) y lo que estoy haciendo es una agenda por lo tanto es super importante el buen manejo de las horas:

1: di de alta en mi base de datos un campo de tipo varchar llamado "Hora".

2: guardo en dicho campo la hora de la siguiente manera:

Código:


                          Add('INSERT INTO Agenda (');
                          Add('Hora,');
                          Add('Values (');
                          Add(sep + FormatDateTime('h:mm am/pm',Time) + sep + ',');

3: quiero hacer un ORDER BY por dicho campo y me encuentro conque no lo hace.

4: supuse que por ser de tipo varchar no lo ordena en orden cronologico, asi que le cambio el tipo al campo y se lo pongo timestamp.

5: intenté guardar el dato de la misma forma que arriba pero me manda el error: "error conversion for string"

6: investigue aqui en el foro y algien me dijo que hiciera la incersión por medio de parámetros:

Código:


                                ParamByName('Hora').AsTime := Time;

7: efectivamente, funcionó... pero al mostrar el campo en un DBGrid lo muestra asi "01/06/2005 06:20:36 pm" y yo solo quiero que me muestre la hora (06:20 pm)

8: posteriormente quiero poder comparar dicha hora contra otra, esto con el fin de hacer avisos al cliente en cierta hora.

espero haberme explicado bien, en fin, espero sus respuestas muchas gracias

saludos

Lepe 02-06-2005 10:46:04

Cita:

Empezado por Unidad Controls
TDateTime = type Double;

TDate = type TDateTime;

TTime = type TDateTime;

Como ves el problema es que en delphi todo son Tdatetimes, y es más, te aconsejo que uses siempre formato de Fecha y hora cuando tengas que comparar, sumar y/o restar, ya que delphi tiene una amplia biblioteca de funciones para estos menesteres en DateUtils. Deja que guarde la fecha y hora, así cuando tengas que pedir un listado ordenado por fecha, no tendrás problemas.

Lo único que se me ocurre en este momento es usar el OnGetText del campo para que devuelva solo la parte horaria.

Citlalli 03-06-2005 01:15:23

gracias lepe, me podrias mostrar un ejemplo?


saludos

Lepe 03-06-2005 12:32:12

Código Delphi [-]
procedure TForm1.Table1HireDateGetText(Sender: TField; var Text: String;
  DisplayText: Boolean);
begin
  Text := FormatDateTime('hh:nn',Table1HireDate.AsDateTime);
end;

El campo se llama HireDate, es de la base de datos DBDemos que incluye delphi.

Haz Doble clic sobre tu tabla, señala el campo de tipo Fecha, y ahora en el inspector de objetos, en los eventos, tienes el GetText.

Cualquier Control que use este dataset para mostrar la hora, mostrará solo la hora y minutos.

En lugar de hacerlo directamente sobre la tabla, igual te conviene hacerlo solo en las consultas (para mostrarlo en el grid).

Un saludo

Citlalli 06-06-2005 06:20:52

Lepe, en verdad... muchísimas gracias por tu ayuda.


Saludos

ahkimpech 06-06-2005 16:48:09

DecodeTime
 
Verifia con la función DecodeTime; Sirve para extraer la hora (hh:mm:ss) de una variable o campo de tipo TDateTime (Delphi) o TimeStamp (Interbase).
Existe la contraparte EncodeTime. Delphi tiene muchas funciones para el manejo de campos Fecha y hora.

Citlalli 07-06-2005 06:42:53

Gracias ahkimpech pero esas funciones las conozco muy bien y para este caso no me sirven.

Lepe, oye fijate que me funcionó muy bien lo que me dijiste del GetText, pero ahora tengo otro problema... que problemática verdad jaja, fijate que no encuentro como comparar ahora dicho campo, mira tengo un timer en el que pongo:

Código:


procedure TMain.t_agendaTimer(Sender: TObject);
begin
  with DM.qryWork_Agenda_Aux, DM.qryWork_Agenda_Aux.SQL do
        begin
          Close;
          Clear;
          Add('SELECT');
          Add('Hora');
          Add('FROM');
          Add('Agenda');
          Add('WHERE');
          Add('Fecha = ' + sep + FormatDateTime('MM/dd/yyyy',Date) + sep);
          Open;
          First;
          while not eof do
                begin
                  if DM.qryWork_Agenda_Aux.FieldByName('Hora').AsDateTime = Date then
                        Showmessage(timetostr(time));
                  next;
                end;
        end;
end;

para que cuando el campo hora coincida con la hora del equipo me mande un mensaje.

Estoy insertando la hora en la tabla mediante parámetros como te mencioné antes.

Te explico exactamente que es lo que quiero desarrollar:

una agenda que funciona como un catalogo, el usuario da click en el boton insertar y aparece un cuadro de dialogo que le pide el mensaje y la hora en que quiere el aviso; listo, él sigue trabajando y cuando el timer detecta la hora del aviso, se debe mostrar una ventana con el mensaje que él capturó.

ojala me haya explicado, no soy muy buena describiendo verdad!! muchas gracias

Saludos

Citlalli 07-06-2005 06:45:45

peeeeerdon, se me olvidaba lo mas importante: mencionarte que mi comparación no sirve, nunca me manda el mensaje.

ahora si, si nuevamente me puedes ayudar te lo voy a agradecer muchisimo, gracias.

saludos

Lepe 07-06-2005 10:28:15

Deberías poner un showMessage en la linea:

DM.qryWork_Agenda_Aux.FieldByName('Hora').AsDateTime

para ver que te devuelve exactamente, no sé si devuelve HH:mm o bien HH:mm:ss depende de donde hayas puesto el OnGetText (en la tabla principal o en una consulta)

Como la fecha se la pasas por parametro, ese último "if" puedes construirlo con DateUtils, para montar la fecha de aviso en formato Fecha y hora y así hacer las comparaciones con "FechaAviso <= Now". Ten en cuenta que por un milisegundo de diferencia, las fechas y horas no son iguales.

Un saludo y ya me contarás.

Citlalli 10-06-2005 20:20:55

Hola lepe, fijate que no he podido dar con la solucion, por favor aaayuudaaa!!!


Gracias

Lepe 13-06-2005 17:29:25

Cita:

Empezado por Lepe
Deberías poner un showMessage en la linea:

DM.qryWork_Agenda_Aux.FieldByName('Hora').AsDateTime

Que te sale??? sale la fecha correcta?, es igual a la fecha de hoy??

Un saludo

Citlalli 13-06-2005 18:56:01

Hola lepe, mira puse los siguientes showmessages y el resultado:


Código:


          showmessage(Datetimetostr(DM.qryWork_Agenda_Aux.FieldByName('Hora').AsDateTime));
          showmessage(timetostr(DM.qryWork_Agenda_Aux.FieldByName('Hora').AsDateTime));


el primero da un mensaje asi 13/06/2005

el segundo da un mensaje asi 12:00:00 a.m. que por cierto dicha hora no la tengo guardada en la base de datos, no se por que me dan las 12.

gracias lepe por tu ayuda


La franja horaria es GMT +2. Ahora son las 17:32:31.

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