TQuery的日期問題 |
尚未結案
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
看你的資料庫類別, 這裡先舉 ms sql 的 datediff 函數來進行.. select count(*) from table where datediff(d, 裝設日期, getdate() ) > 保固期*365*0.8 呵....看來 Justmade 前輩手腳還是比較快 補充一下.. 若沒有 datediff 的其他資料庫, 可以用這樣的方式: select count(*) from t2 where getdate()- 裝設日期 > 保固期*365*0.8 前提是該日期的欄位是以日為整數即可!! 發表人 - timhuang 於 2003/05/02 10:30:16
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
|
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
前輩們我想到一個方法不知是否可行,請幫我看看如何解決
procedure TForm1.Button1Click(Sender: TObject); var P1,Y1,BD,BD1,BD2,Date1:string; Y2:real; begin Query1.Open; Query1.First; Date1:=FormatDateTime('yyyymmdd',date); //取得今天的日期(字串) While Not Query1.Eof do begin P1:=Query1.FieldByName('PNO').AsString; //設備代號 BD:=Query1.FieldByName('BDATE').AsString; //裝設日期 Y1:=Query1.FieldByName('YEARS').AsString; //保固期 Y2:=StrToInt(Y1)*365*0.8; //保固期80%的天數 BD1:=copy(BD,1,4) '/' copy(BD,5,2) '/' copy(BD,7,2); //將BD(YYMMDD)改成日期格式(YYYY/MM/DD) BD2:=FormatDateTime('yyyymmdd',strtodate(BD1) Y2); //計算裝設日期 保固期80%的天數的日期 If BD2 |
ooctiger
一般會員 發表:25 回覆:46 積分:14 註冊:2002-07-08 發送簡訊給我 |
對不起字太小了,重貼一次 前輩們我想到一個方法不知是否可行,請幫我看看如何解決
procedure TForm1.Button1Click(Sender: TObject); var P1,Y1,BD,BD1,BD2,Date1:string; Y2:real; begin Query1.Open; Query1.First; Date1:=FormatDateTime('yyyymmdd',date); //取得今天的日期(字串) While Not Query1.Eof do begin P1:=Query1.FieldByName('PNO').AsString; //設備代號 BD:=Query1.FieldByName('BDATE').AsString; //裝設日期 Y1:=Query1.FieldByName('YEARS').AsString; //保固期 Y2:=StrToInt(Y1)*365*0.8; //保固期80%的天數 BD1:=copy(BD,1,4) '/' copy(BD,5,2) '/' copy(BD,7,2); //將BD(YYMMDD)改成日期格式(YYYY/MM/DD) BD2:=FormatDateTime('yyyymmdd',strtodate(BD1) Y2); //計算裝設日期 保固期80%的天數的日期 If BD2我的最終結果是要將以裝設日期起計算超過保固期80%的設備 在報表上呈現出來--QReport 我的想法是 (1)由Query1取得P1,Y1,BD,BD2然後//將P1,Y1,BD,BD2存到一個暫存檔 (2)在報表中Select出TmpTable的所有資料. 問題在於我不知要如何//將P1,Y1,BD,BD2存到TmpTable中 ,再利用Query2把TmpTable中的資料Select出來 請各位前輩指點一下 Thank you ! |
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
我不懂DB2甚樣處理日期所以不能提供你應其樣寫SQL
但若你只是用來作 Report 可以用較簡單的方法:
直接在 QReport 的 DetailBand BeforePrint 時件判別,附合的便 PrintBand := True,不附合的 PrintBand := False
procedure TForm1.DetailBand1BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); var P1,BD :string; Y1 : integer; dBD, dED : TDate; begin P1:=Query1.FieldByName('PNO').AsString; //設備代號 BD:=Query1.FieldByName('BDATE').AsString; //裝設日期 Y1:=Query1.FieldByName('YEARS').AsInteger; //保固期 (已化為整數) dBD := EncodeDate(StrToInt(copy(BD,1,4)),StrToInt(copy(BD,5,2)),StrToInt(copy(BD,7,2))); dED := EncodeDate(StrToInt(copy(BD,1,4)) Y1,StrToInt(copy(BD,5,2)),StrToInt(copy(BD,7,2))); if (Date - dBD) / (dED - dBD) > 0.8 then // 現在和保固期的比例 PrintBand := true else PrintBand := false; end; |
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
1.
procedure TForm1.Button1Click(Sender: TObject); var P1, Y1, BD, BD1, BD2, Date1: string; Y2: real; begin try //開暫存檔ABC_TEMP.DB,產生在執行檔同目錄下 Table1.Close; Table1.TableType := ttParadox; Table1.TableName := 'ABC_TEMP.DB'; Table1.FieldDefs.Clear; Table1.FieldDefs.add('P1', ftstring, 20, false); Table1.FieldDefs.add('Y1', ftstring, 20, false); Table1.FieldDefs.add('BD', ftstring, 20, false); Table1.FieldDefs.add('BD2', ftstring, 10, false); Table1.IndexDefs.Clear(); //設定index Table1.IndexDefs.Add('', 'P1;BD2', [ixUnique, ixPrimary]); Table1.CreateTable; Table1.EmptyTable; Table1.Open; Query1.Open; Query1.First; Date1 := FormatDateTime('yyyymmdd', date); //取得今天的日期(字串) while not Query1.Eof do begin P1 := Query1.FieldByName('PNO').AsString; //設備代號 BD := Query1.FieldByName('BDATE').AsString; //裝設日期 Y1 := Query1.FieldByName('YEARS').AsString; //保固期 Y2 := StrToInt(Y1) * 365 * 0.8; //保固期80%的天數 BD1 := copy(BD, 1, 4) '/' copy(BD, 5, 2) '/' copy(BD, 7, 2); //將BD(YYMMDD)改成日期格式(YYYY/MM/DD) BD2 := FormatDateTime('yyyymmdd', strtodate(BD1) Y2); //計算裝設日期 保固期80%的天數的日期 if BD2 then //這裡你要把條件式寫出來 begin //將P1,Y1,BD,BD2的值寫入暫存檔--TmpTable Table1.Insert; Table1P1.Value := P1; Table1Y1.Value := Y1; Table1BD.Value := BD; Table1BD2.Value := BD2; ShowMessage('超過保固期 ' BD2) end else ShowMessage('尚未超過保固期 ' BD2); Query1.Next; end; except //程式結束的時候要記的將ABC_TEMP刪除掉 DeleteFile('ABC_TEMP.DB'); DeleteFile('ABC_TEMP.PX'); DeleteFile('ABC_TEMP.VAL'); ShowMessage('存檔失敗!!!'); exit; end; end;2.你在用Query2 SELECT * FROM ABC_TEMP 就可以在報表上呈現出來 TRY TRY SEE |
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
下面的语句就可以,其中函数都是DB2自己的函数。
说明:
CURRENT DATE是数据库服务器当前日期 DATE
>>-DATE--(--expression--)--------------------------------------><
The schema is SYSIBM.
The DATE function returns a date from a value. DAYS
>>-DAYS--(--expression--)--------------------------------------><
The schema is SYSIBM.
The DAYS function returns an integer representation of a date. SUBSTR
>>-SUBSTR--(--string--,--start----+-------------+--)-----------><
'-,--length---'
The schema is SYSIBM.
The SUBSTR function returns a substring of a string. 语句如下: query1.SQL.Add('select * from Table where (days(CURRENT DATE)-DAYS(date(SUBSTR(裝設日期,1,4)+''-''+SUBSTR(裝設日期,5,2)+''-''+SUBSTR(裝設日期,7,2))))>integer(保固期)*365*0.8'); 你可以到DB2命令中心试试!!! 风花雪月 e梦情缘
------
风花雪月 e梦情缘 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |