明明显示得插入的是一个时间,但是等插入导数据库就少了1毫秒什么问题?procedure TForm1.Button4Click(Sender: TObject);
var A:Tdatetime;
begin
A:=now();
edit1.text:=formatdatetime('yyyy-MM-dd hh:nn:ss:zzz',A);
showMessage(formatdatetime('yyyy-MM-dd hh:nn:ss:zzz',A));
with Adoquery1 do
begin
     close;
     sql.Clear;
     sql.Add('插入时间 '+Quotedstr(formatdatetime('yyyy-MM-dd hh:nn:ss:zzz',A))) ;
     ExecSQL;
end;
showMessage(formatdatetime('yyyy-MM-dd hh:nn:ss:zzz',A));
end;假如当按按钮时候弹出的窗口和edit1中都显示2008-10-23 20:00:46:205,最后一次的弹出窗口也显示2008-10-23 20:00:46:205,但是我在数据库(MS SQLserver2000)中查看的时候插入的不是2008-10-23 20:00:46:205而是2008-10-23 20:00:46:207,推迟了2毫秒,多得时候推迟1毫秒,但是没有不差分离的那种!为什么出现这种状况?

解决方案 »

  1.   

    你自己做个试验,确实有延迟的。用两个edit就可以看出来了。procedure Tform1.button1Click(Sender:TObject); 
    var 
      A,B:TDate; 
    begin
    edit1.Clear;edit2.Clear; 
    A:=now(); 
    edit1.text:=formatdatetime('yyyy-MM-dd hh:nn:ss:zzz',A); 
    B:=strtodatetime(edit1.text); 
    edit2.text:=formatdatetime('yyyy-MM-dd hh:nn:ss:zzz',B); 
    end;
      

  2.   


    你的这个当然有延迟了,但是我的和你说的这个不一样啊,从头到尾都是A:TDateTime,但是插入到数据库就有了出入,而且这个出入一会大一会小,有时候还没有出入!
      

  3.   

    顶,以上问题我也是第一次遇见,我都没有用过Datetime类型的毫秒级的数
      

  4.   

    delphi的时间导入数据库的时候可能进行了某种转换
      

  5.   

    在开发应用程序时往往需要获取当前系统时间。尽管Y2K似乎已经平安过去,但在我们新开发的应用程序中还是要谨慎处理“时间”问题。
    在1999年7月出版的文献《融会贯通--Delphi4.0实战技巧》(以下简称“该书”)第89页专门介绍了两种获取当前系统时间的方法,但这两种方法都存在不足或错误,以下就此进行讨论。
    该书第一种方法是利用Time()函数获得当前系统时间,返回结果是TDateTime结构类型的变量。例如:
    procedure TForm1.Button2Click(Sender: TObject);
    var
    DateTime:TDateTime;
    begin
    DateTime:=Time();
    Caption:=DateToStr(DateTime)+‘ ‘+TimeToStr(DateTime);
    end;
    但不论何日期,其结果却都是99-12-30 xx:xx:xx, 显然日期出错了。通过分析Delphi的帮助,Time()用于返回正确的“时间--时分秒”即TimeToStr(DateTime),而不应该用于返回“日期”。事实上,单独用于返回日期的系统函数是Date。
    那么有什么是既可返回正确的“时分秒”又可返回正确的“年月日”呢? 可以用Now函数,例如:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    mytime: TDateTime;
    begin
    mytime:=Now;
    Caption:=DateToStr(mytime)+‘ ‘+TimeToStr(mytime);
    //或直接用 Caption := DateTimeToStr(Now);
    end;
    用Now返回的日期格式中年只有2位,即2000年显示为00, 这似乎不太令人满意. 此外Now和Time都只能获得精确到秒的时间,为了得到更精确的毫秒级时间,可以使用API函数GetSystemTime,它对应的TSystemTime类型的定义为:
    TSystemTime = record
    wYear: Word;
    wMonth: Word;
    wDayOfWeek: Word;
    wDay: Word;
    wHour: Word;
    wMinute: Word;
    wSecond: Word;
    wMilliseconds: Word;
    end;
    显然,在程序逻辑中还能够方便地使用其结构成?时---各类时间值,因此使用函数GetSystemTime具有很大优越性。但该书中该函数的用法是错误的,通过查阅Windows SDK帮助可知,该函数原型为:
    VOID GetSystemTime(LPSYSTEMTIME lpst),参数指针lpst获取系统时间,因此可如以下程序段实现:
    procedure TForm1.Button3Click(Sender: TObject);
    var
    SysTime: TsystemTime;
    begin
    GetSystemTime(SysTime);
    Caption:=IntToStr(SysTime.wYear)+‘ ‘+IntToStr(SysTime.wMonth);
    //if SysTime.wYear>2000 then
    // ......在程序逻辑中利用获取的各类时间值 
    end;
    综合以上讨论,获取当前系统时间利用函数GetSystemTime比较方便而且灵活转过来,大家看看吧,不知道能帮到不?
      

  6.   

    说真的,没遇到过,你都是formatdatetime同一个时间,按理说应该不会存在时间误差,你插入的时候虽然format了,但对SQL语句来说不是时间,而是一段字符串。你或许可以将SQL的表字段改为varchar,这样肯定不会出现时间误差。我感觉可能SQL的表字段为DateTime,而SQL对时间的Format或显示和Delphi有点不同,或内部时钟什么的,导致时间显示不一样。但不管怎样,值我想是一样的。
      

  7.   

    那你改成这样呢:
    procedure TForm1.Button4Click(Sender: TObject); 
    var A:Tdatetime; 
       str:string;
    begin 
    A:=now(); 
    str:=formatdatetime('yyyy-MM-dd hh:nn:ss:zzz',A); 
    edit1.text:=str;
    showMessage(str); 
    with Adoquery1 do 
    begin 
        close; 
        sql.Clear; 
        sql.Add('插入时间 '+Quotedstr(str)) ; 
        ExecSQL; 
    end; 
    showMessage(str); 
    end; 
      

  8.   

    Delphi中处理日期时间其实是一个浮点数。肯定有偏差。
    你把它当成一个字符串来处理就不会出现这种情况了吧