Delphi数据集控件处理时间的差异问题(200分)

  • 主题发起人 主题发起人 wkq2000
  • 开始时间 开始时间
W

wkq2000

Unregistered / Unconfirmed
GUEST, unregistred user!
环境: 后台MS SQL Server, BDE引擎
如下代码:
var
F: TDateTime;
begin
F := Now;
Query1.Append;
Query1.FieldByName('OPTIME').AsDateTime:= F;
ListBox1.Items.Add('Now: ' + FormatDateTime('YYYYMMDD HH:MM:SS.ZZZ', F) + ' -- '
+ 'QueryTime: ' + FormatDateTime('YYYYMMDD HH:MM:SS.ZZZ', Query1.FieldByName('OPTIME').AsDateTime));
end;
实验发现, 在数据集中的'OPTIME'的毫秒级时间总是会将F自动"四舍五入"成'0'.'3'.'6'.'9'四种情况,例如ListBox中:
"Now: 20020909 10:15:17.807 -- QueryTime: 20020909 10:15:17.806"
接着将数据提交:
if not DataBase1.InTransaction then
DataBase1.StartTransaction;
try
Query1.ApplyUpdates;
DataBase1.Commit;
except
DataBase1.Rollback;
end;
实际上后台数据库所保存的数据的'OPTIME'字段的值为:'2002-09-09 10:15:17.803'
通过SQL Monitor监视的SQL语句发现:提交语句是用参数将字段的值代入Insert语句中,而以外的是
58 10:16:45 SQL Data In: MSSQL - Param = 4, Name = , Type = fldTIMESTAMP, Precision = 0, Scale = 0, Data = 9/9/2002 10:15:17:803000000
这样一来,实际存储的数据和原本赋予的值相差很远了,从'20020909 10:15:17.807'变成'2002-09-09 10:15:17.803'
再提供几组测试数据:
F(Now) Query1.FieldByName('OPTIME').AsDateTime 后台数据
2002-09-09 10:41:26.966 2002-09-09 10:41:26.963 2002-09-09 10:41:26.960
2002-09-09 10:41:27.421 2002-09-09 10:41:27.420 2002-09-09 10:41:27.420
....

请教各位关于这种时间上的差异怎么解决????




 
我用的是Ado引擎,没有发现上面的问题,一切正常!
 
问题是我现在已经不可能去换引擎了:(
 
对不起,没有办法调试:用asFloat ,AsSQLTimeStamp,看看
 
AsFloat, AsString, AsSQLTimeStamp, Value等方法都试过,结果都是一样.....
 
测试1:在程序中用
INSERT INTO TEST VALUES('1','2002-1-3 1:1:1.231')
直接插入,从SQLSERVER PROFILE 看,接收没有错误,但是数据库在做插入动作时有误
测试2:在SQL ANALSYZER中用
INSERT INTO TEST VALUES('1','2002-1-3 1:1:1.231')
结果和程序中一样

你直接用STRING向数据库里插入,更新
INSERT INTO TEST VALUES('1','2002-1-3 1:1:1.231')
但是,结果只是好一点,SQLSERVER又吃掉一点,余下的工作就是SQLSERVER的设置了,我
还没有找到
 
不幸:
看SQL SERVER 对 datetime 的描述
Date and time data from January 1, 1753, to December 31, 9999,
with an accuracy of three-hundredths of a second, or 3.33 milliseconds.
 
to MTJ:
其实关于后台SQL Server会怎样处理时间的毫秒并不重要,我觉得是在Delphi中的TQuery控件
在处理时间上存在误差. 正如楼上说的,在使用ADO数据集控件时,就不会发生这种问题. 两者
同样是使用SQL Server驱动程序, 但是却有前者的差异存在,那么是否可以说是TQuery本身的
问题呢?
 
你想干什么?

如果忽略SQL SERVER 在处理时间精度上的问题
你用 Query1.FieldByName('OPTIME').AsString:= FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz',f);
就可以了

我认为在数据类型转换上进行取舍是很正常的,也不能说谁对谁错
 
后退
顶部