我正在编写一个执行特定任务的迷你调度程序。对于计算触发时间,我使用MYSQL。我很难写出其中一条问询。
找出比给定的时间更大的即时DateTime,
和
所需即期日期的日期应为给定日期的任何一天。
和
所需即时日期时间的时间(HH:MM:SS)部分应等于给定的时间。
示例:
(a)
如果给定的时间是(“星期一”,“星期三”,“SAT”),
如果时间是10:15
预定时间为2014-11-12 23:17:00
然后MYSQL应该返回2014-11-15 10:15:00。
(b)
给定天数:(“太阳”、“SAT”、“TUES”)
指定时间: 09:10:00
预定时间为2014-11-30 07:05:12
MYSQL应返回2014-11-30 09:10:00
(c)
给定的天数:('MON','THURS','SAT')
指定时间:11:00
预定时间为2014-12-29 11:55:12
MYSQL应返回2015-01-01 :00:00
(d)日数:(太阳、THURS、SAT)‘
预定时间为2014-02-27 18:15:00
给定时间15:15:00
MYSQL查询结果: 2014-03-01 15:15:00
(e)
日:(星期二,星期三,星期五)
日期: 2014-12-23 09:30:00
时间:08:00
预期结果:
2014-12-24 08:00:00
(f)
日:太阳,太阳,太阳
日期: 2014-07-31 10:10:00
时间: 06:07:08
预计决议: 2014-08-03 06:07:08
发布于 2014-11-16 19:37:39
使用工作日数字,0=Monday,6=Sunday:
set @day1=0;
set @day2=2;
set @day3=5;
set @time=time('10:15:00');
set @prevtime=timestamp('2014-11-12 23:17:00');
select if(weekday(@nexttime:=date_add(concat(date(@prevtime),' ',@time),interval if(@time>time(@prevtime),0,1) day)) in (@day1,@day2,@day3),@nexttime,if(weekday(@nexttime:=date_add(@nexttime,interval 1 day)) in (@day1,@day2,@day3),@nexttime,if(weekday(@nexttime:=date_add(@nexttime,interval 1 day)) in (@day1,@day2,@day3),@nexttime,if(weekday(@nexttime:=date_add(@nexttime,interval 1 day)) in (@day1,@day2,@day3),@nexttime,if(weekday(@nexttime:=date_add(@nexttime,interval 1 day)) in (@day1,@day2,@day3),@nexttime,if(weekday(@nexttime:=date_add(@nexttime,interval 1 day)) in (@day1,@day2,@day3),@nexttime,date_add(@nexttime,interval 1 day))))))) as nexttime;如果您只有一个工作日,则可以将所有三个变量设置为相同的数目。
发布于 2014-11-12 21:05:21
您应该能够使用DAYNAME()、HOUR()、using ()和SECOND()函数来构造where子句:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html
例如,如果性能不足,并且希望能够在DAYNAME (列名)上进行索引,则可以考虑对数据进行反错误化并分别存储DAYNAME值。不过,此时切换到Postgres可能更简单:http://www.postgresql.org/docs/9.1/static/indexes-expressional.html
https://stackoverflow.com/questions/26893403
复制相似问题