線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1325
推到 Plurk!
推到 Facebook!

adoquery返回的時間比資料庫中的實際時間少1秒?

答題得分者是:darnell
xnium
一般會員


發表:27
回覆:26
積分:10
註冊:2007-09-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-11 13:06:51 IP:218.107.xxx.xxx 訂閱
第一次遇到這樣的情況,先上代碼:

[code delphi]


sqlADOConnection.Close;
sqlADOConnection.Open;
sqlADOQuery.Connection:=sqlADOConnection;
sqlADOQuery.Close;
sqlADOQuery.SQL.Clear;
sqlADOQuery.SQL.Add('SELECT PAccM3a02,PAccM3a01 FROM PAccM301 WHERE PAccM3a03 like :PAccM3a03 and PAccM3a05 <>:PAccM3a05 ');
sqlADOQuery.Parameters.ParamByName('PAccM3a03').Value := '00A03%';
sqlADOQuery.Parameters.ParamByName('PAccM3a05').Value := '1';
sqlADOQuery.Open;
for i := 1 to sqlADOQuery.RecordCount do
begin
try
showmessage(sqlADOQuery.Fields[0].AsString ' before insert ' datetimetostr(sqlADOQuery.fieldbyname('PAccM3a01').Value));
......
showmessage(sqlADOQuery.Fields[0].AsString ' afert insert ' datetimetostr(sqlADOQuery.Fields[1].AsDateTime));
......
sqlADOQuery.Next;
except
showmessage('ez6j failed to insert hr');
end;
end;
[/code]
請看這句 showmessage(sqlADOQuery.Fields[0].AsString ' before insert ' datetimetostr(sqlADOQuery.fieldbyname('PAccM3a01').Value));
就是秀出查詢的返回值,我發現,在資料庫里面的值是:‘2008-12-11 0:02:24’,可是返回的居然是‘2008-12-11 0:02:23’
不曉得是怎么回事,懇請大俠幫忙看下
------
对岸的菜鸟,但是很喜欢用delphi!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-11 15:36:57 IP:61.67.xxx.xxx 未訂閱
('SELECT PAccM3a02,PAccM3a01 FROM PAccM301 WHERE PAccM3a03 like :PAccM3a03 and PAccM3a05 <>:PAccM3a05 ');
for i := 1 to sqlADOQuery.RecordCount do
begin
try
showmessage(sqlADOQuery.Fields[0].AsString ' before insert ' datetimetostr(sqlADOQuery.fieldbyname('PAccM3a01').Value));
......
showmessage(sqlADOQuery.Fields[0].AsString ' afert insert ' datetimetostr(sqlADOQuery.Fields[1].AsDateTime));

我想, FIELDS[1] 應該就是 PACCM3A01 欄位吧, 你要不要把這兩句使用同一屬性後再做比較
如改為 sqlADOQuery.fieldbyname('PAccM3a01').AsDateTime
或者 sqlADOQuery.Fields[1].Value
另外, 並沒有看到你對 PAccM3a01 欄位做了什麼事, 不知道發生什麼事了

darnell
版主


發表:25
回覆:103
積分:145
註冊:2003-03-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-11 15:54:28 IP:60.250.xxx.xxx 訂閱
這種情況可能很難避免喔...

可以參考
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=51418
http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=40898
http://support.microsoft.com/kb/281676/zh-tw
根據微軟文件說的沒有方法可以完全避免遺失精確度的時間 (以毫秒為單位)
可能因為豪秒在.999剛好進位處導致你的進位因此誤差擴大到1秒

看一下Delphi中system.pas
TDateTime = type Double;浮點數,如果經過轉換難免就會有誤差喔

有沒辦法解決呢???有~~改用文字型態儲存日期時間,只是比較麻煩,
如果有其他方法我也想知道~不過我目前不知道
xnium
一般會員


發表:27
回覆:26
積分:10
註冊:2007-09-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-11 16:05:42 IP:218.107.xxx.xxx 訂閱
多謝兩位版主大人的回復
我就是很奇怪,我只是很簡單的應用,把資料從資料庫中取出,卻少了一秒,很是郁悶
darnell版主提到的改變資料庫的儲存型態,可能是種解決方法,可是在下沒有權限去改變,權作了解吧
最后還是要感謝兩位的熱心幫助
------
对岸的菜鸟,但是很喜欢用delphi!
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-11 17:52:36 IP:122.116.xxx.xxx 未訂閱
插花一下,

不知您是用什麼方法
發現資料庫里面的值是:'2008-12-11 0:02:24’

如果是用別的 tool 去看資料庫的內容, 那我覺得應該是不一樣的程式 ( tool 程式 和 delphi )
對精確度的處理方式不一樣的關係( 像 delphi 的 round 就和我們想像的不同, 他就是採用不同的定義 )

說不定 即使同在 delphi 下用不同元件顯示的也會不一樣.

另外, 您可以用 formatdatetime('yyyymmdd hh:nn:ss:zzz) 看一下 millisecond 的狀態

參加討論一下.
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-11 17:56:56, 註解 無‧
xnium
一般會員


發表:27
回覆:26
積分:10
註冊:2007-09-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-11 17:58:22 IP:218.107.xxx.xxx 訂閱
呵呵,我是用的SQLSERVER 2000 的資料庫,我用"enterprise manger"  發現資料庫里面的值是:'2008-12-11 0:02:24’
===================引 用 st33chen 文 章===================
插花一下,

不知您是用什麼方法
發現資料庫里面的值是:'2008-12-11 0:02:24’

如果是用別的 tool 去看資料庫的內容, 那我覺得應該是不一樣的程式 ( tool 程式 和 delphi )
對精確度的處理方式不一樣的關係( 像 delphi 的 round 就和我們想像的不同, 他就是採用不同的定義 )

說不定 即使同在 delphi 下用不同元件顯示的也會不一樣.

參加討論一下.
------
对岸的菜鸟,但是很喜欢用delphi!
系統時間:2024-05-06 12:17:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!