MYSQL查询立即查找下一个DateTime

时间:2014-11-12 17:55:54

标签: mysql date datetime

我正在写一个执行特定任务的迷你调度程序。 为了计算触发时间,我正在使用MYSQL。我一直在写一个查询。

查找立即DateTime ,其大于给定的上一个时间

所需的立即日期时间的日期应该是给定日期的任何一天

所需立即日期时间的时间(HH:MM:SS)部分应等于给定时间。

示例:

(a)中

如果给定的日期是(' MON',' WEDNES',' SAT'),

给定时间是10:15:00,

鉴于prevtime是2014-11-12 23:17:00

然后MYSQL应该返回 2014-11-15 10:15:00

(b)中

给定日期:(' SUN',' SAT'' TUES')

鉴于时间:09:10:00

鉴于上次时间是2014-11-30 07:05:12

MYSQL应该返回 2014-11-30 09:10:00

(c)中

给定天数:(' MON',' THURS'' SAT')

鉴于时间:11:00:00

鉴于上次时间是2014-12-29 11:55:12

MYSQL应该返回 2015-01-01 11:00:00

(d) 天:(SUN,THURS,SAT)'

鉴于上次时间是2014-02-27 18:15:00

鉴于时间15:15:00

MYSQL查询结果: 2014-03-01 15:15:00

(e)中

DAYS :( TUES,WED,FRI)

上一个日期:2014-12-23 09:30:00

时间:08:00:00

预期结果:

2014-12-24 08:00:00

(F)

DAYS:SUN,TUES,THURS

上一个日期:2014-07-31 10:10:00

时间:06:07:08

预期结果: 2014-08-03 06:07:08

2 个答案:

答案 0 :(得分:1)

使用数字工作日数字,0 =星期一,6 =星期日:

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;

如果您只有一个工作日,则可以将所有三个变量设置为相同的数字。

答案 1 :(得分:0)

您应该能够使用DAYNAME(),HOUR(),MINUTE()和SECOND()函数来制定where子句: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

如果性能不足并且您开始希望您可以在DAYNAME(columname)上编制索引,则可以考虑对数据进行非规范化并分别存储DAYNAME值。 在那时切换到Postgres可能更简单: http://www.postgresql.org/docs/9.1/static/indexes-expressional.html

相关问题