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

TQuery的日期問題

尚未結案
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-02 09:56:44 IP:61.219.xxx.xxx 未訂閱
Table內容如下 設備代號,裝設日期,保固期 ------------------------ 01,20020101,1 --(年) 02,20020420,1 03,20020530,1 04,20020630,1 05,20020930,1 問題: 可否使用1個TQuery Select出超出保固期的80%的所有資料 說明: 1.以裝設日期起計算超過保固期80%的設備 2.保固期以天數計算 Ex. 1年(365天)==>1年的80%(292天)
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-02 10:11:00 IP:218.16.xxx.xxx 未訂閱
Query1.SQL.Text := 'select * from table where 裝設日期 < :zDate and 裝設日期 > zDate2'; Query1.ParamByName('zDate').AsDate := Date - 292; Query1.ParamByName('zDate2').AsDate := Date - 365; Query1.Active := true; 發表人 - Justmade 於 2003/05/02 10:12:47
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-02 10:21:14 IP:211.76.xxx.xxx 未訂閱
看你的資料庫類別, 這裡先舉 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-02 11:08:09 IP:61.219.xxx.xxx 未訂閱
對不起忘了一件重要的事 裝設日期是String型態(YYYYMMDD) 另外保固期也是String型態 煩請前輩再指導一下
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-02 12:22:18 IP:211.76.xxx.xxx 未訂閱
引言: 裝設日期是String型態(YYYYMMDD) 另外保固期也是String型態
那就自行先轉型, 利用 convert 或是 cast, 以下為範例: select count(*) from table where datediff(d, convert(datetime, 裝設日期), getdate() ) > convert(int, 保固期)*365*0.8 不過會因為資料庫種類的不同而有不同的用法, 請先說明你的資料庫類別!!
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-02 13:26:54 IP:61.219.xxx.xxx 未訂閱
timhuang前輩 我使用的資料庫是 db2 請再賜教
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-04 22:22:08 IP:218.172.xxx.xxx 未訂閱
前輩們我想到一個方法不知是否可行,請幫我看看如何解決
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 !     
        
ooctiger
一般會員


發表:25
回覆:46
積分:14
註冊:2002-07-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-04 22:31:43 IP:218.172.xxx.xxx 未訂閱
對不起字太小了,重貼一次    前輩們我想到一個方法不知是否可行,請幫我看看如何解決
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//將P1,Y1,BD,BD2存到一個暫存檔--TmpTable
            end;   
         else
            ShowMessage('尚未超過保固期 ' BD2);
         Query1.Next;          end;
end;
我的最終結果是要將以裝設日期起計算超過保固期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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-05 08:52:14 IP:218.16.xxx.xxx 未訂閱
我不懂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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-05 10:16:27 IP:211.74.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-05 11:00:25 IP:61.155.xxx.xxx 未訂閱
下面的语句就可以,其中函数都是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梦情缘
系統時間:2024-06-29 18:30:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!