間隔定時掃描特定星期

來源:互聯網
上載者:User
間隔定時掃描特定星期 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiDB/html/delphi_20061225170151111.html
每隔x周(0<x<53),逢星期一、星期二、星期三、星期四、星期五.在8:30執行。  
  如開始執日期為:2006-12-25,每隔3周執行,第一次執行時間為:  
  2006-12-25   8:30  
  2006-12-26   8:30  
  2006-12-27   8:30  
  2006-12-28   8:30  
  2006-12-29   8:30  
  下一次執行時間為:  
  2007-1-15   8:30  
  2007-1-16   8:30  
  2007-1-17   8:30  
  2007-1-18   8:30  
  2007-1-19   8:30  
   
  請問該如何設計此表,及如何定時描述。(需考慮不開機情況。如:2006-12-26   8:30前關機了,到第二天才開,到期未執行的將不再執行。)  
   
   
   
 

 
  一種想法:  
   
  aDate=StrToDateTime("2006-12-25")+7*3;  
   
  if   Now-aDate<1   then   Begin  
   
      if   DayOfTheWeek(aDate)=1   then   Begin     //星期1  
   
      End   Else   if   DayOfTheWeek(aDate)=2   then   Begin     //星期2  
   
      End;  
   
  end;  
       
  --------------------------------------------------------------  
  程式,猶如人生。  
 

最好把任務執行時間單獨放到一個如下的資料結構中,結構如下:(可以用表的形式,也可以用結構檔案等形式)  
  日期時間                   是否執行操作  
  2006-12-25   8:30            
  2006-12-26   8:30  
  2006-12-27   8:30  
  2006-12-28   8:30  
  2006-12-29   8:30  
   
  這樣系統啟動後,掃描此表,對於日期在當前日期之前的,不予操作(可以在是否執行操作的欄位內填寫某個標誌),對於大於當前日期的,取出第一項,然後設定一個等待計時器(設定絕對時間和間隔報時時間),配合等待函數,當時間到代後,執行操作。  
   
  只所以建議使用這種掃描任務計劃表的形式,是因為這樣容易擴充,哪怕有一天你的任務計劃需要改成其他形式,只要是按照時間執行,就可以不改代碼,如果在代碼中寫死了時間計算的部分,那麼以後要擴充,還要改代碼。麻煩。  
   
   
   
   
 

謝謝大家的寶貴意見,wudi_1982所說也許是一種好的方法,但這樣設計的話,資料量會過大,如果間隔周期為1,星期一到星期天每天都執行,開始時間為2006-12-26,無結束日期(或結束日期很大),這樣的話,資料量就會太大。我想要的是不把資料分解出來。不管如何設計,只儲存一條資料。

好辦好辦,簡單簡單。如果你做過交通客運系統的話,你這個問題和車輛調度計劃是一模一樣的。

晚上給你一個完整的表設計和處理語句。(如果你可以等待的話)

我可以等,那先謝謝了。

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[TScheduleInfo]')   and   OBJECTPROPERTY(id,   N'IsUserTable')   =   1)  
  drop   table   [dbo].[TScheduleInfo]  
  GO  
   
  CREATE   TABLE   [dbo].[TScheduleInfo]   (  
  [FScheduleID]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NOT   NULL   ,  
  [FScheduleIntervalDays]   [int]   NOT   NULL   ,  
  [FScheduleOriginalDate]   [datetime]   NOT   NULL   ,  
  [FScheduleTime]   [Char]   (5)   NOT   NULL    
  )   ON   [PRIMARY]  
  GO  
   
  Insert   TScheduleInfo   Values('001',   21,   '2006-12-25',   '08:30')  
  Insert   TScheduleInfo   Values('002',   21,   '2006-12-26',   '08:30')  
  Insert   TScheduleInfo   Values('003',   21,   '2006-12-27',   '08:30')  
  Insert   TScheduleInfo   Values('004',   21,   '2006-12-28',   '08:30')  
  Insert   TScheduleInfo   Values('005',   21,   '2006-12-29',   '08:30')  
   
   
  Select   *   From   TScheduleInfo   Where   DateDiff(Day,   FScheduleOriginalDate,   GetDate())%(FScheduleIntervalDays)   =   0  
   
  ---------------------------------------------  
   
  如有什麼不清楚的地方,   請留言。

學習!!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.