间隔定时扫描特定星期 Delphi / Windows SDK/APIhttp://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
---------------------------------------------
如有什么不清楚的地方, 请留言。
学习!!