MYSQL查询以查找立即的下一个日期时间

MYSQL查询以查找立即的下一个日期时间,mysql,date,datetime,Mysql,Date,Datetime,我正在编写一个执行特定任务的迷你调度程序。 为了计算触发时间,我使用MYSQL。我对写一个问题感到很厌烦 查找大于给定时间的立即日期时间 及 所需即时日期时间的日期应为给定日期中的任意一天 及 所需即时日期时间的时间(HH:MM:SS)部分应等于给定时间 示例: (a) 如果给定的日期为(周一、周三、周六) 给定时间为10:15:00 给定时间为2014-11-12 23:17:00 然后MYSQL应该返回 2014-11-15 10:15:00 (b) 给定日期:('SUN'、'SAT'、'T

我正在编写一个执行特定任务的迷你调度程序。 为了计算触发时间,我使用MYSQL。我对写一个问题感到很厌烦

查找大于给定时间的立即日期时间

所需即时日期时间的日期应为给定日期中的任意一天

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

示例:

(a)

如果给定的日期为(周一、周三、周六)

给定时间为10:15:00

给定时间为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)

给定日期:(‘星期一’、‘星期四’、‘星期六’)

给定时间:11:00:00

给出的时间是2014-12-29 11:55:12

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

(d) 天:(星期日、星期四、星期六)

给定时间为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:00

预期结果:

2014-12-24 08:00:00

(f)

日期:星期日、星期二、星期四

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

时间:06:07:08

预期收益:
2014-08-03 06:07:08

您应该能够使用DAYNAME()、HOUR()、MINUTE()和SECOND()函数来构造where子句:

如果性能不够,你开始希望你可以在日文(CordNoX)上索引,你可以考虑对数据进行反规范化,并单独存储日名值。 不过,此时切换到Postgres可能更简单:


使用数字工作日数字,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;

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

您使用的是哪种编程语言?我想这不是mysql任务,我正在尝试使用mysql查询,在以下情况下返回的值是错误的:
SET@day1='2';设置@time=time('05:15:00');SET@prevtime=时间戳('2014-11-20 06:57:27');在(@day1)中选择IF(工作日(@nexttime:=日期添加(@nexttime),'',@time),间隔IF(@time>time(@prevtime),0,1)天),在(@day1)中选择IF(工作日(@nexttime:=日期添加(@nexttime,间隔1天)),在(@day1)中选择IF(工作日(@nexttime:=日期添加(@nexttime,间隔1天)),在(@nexttime:=日期添加(@nexttime,INTERVAL 1 DAY))在(@day1),@nexttime,DATE_添加(@nexttime,INTERVAL 1 DAYааа);
案例2:
设置@day1='3';设置@time=time(@05:15:00');设置@prevtime=TIMESTAMP('2014-11-20 06:57:27');选择是否(工作日(@nexttime:=DATEа添加(CONCAT(DATE(@prevtime),'','',@time),INTERVAL IF(@time>time)(@prevtime),0,1)天(@day1),@nexttime,IF(工作日(@nexttime:=日期添加(@nexttime,间隔1天))在(@day1),@nexttime,IF(工作日(@nexttime:=日期添加(@nexttime,间隔1天))在(@day1),@nexttime,IF(工作日(@nexttime:=日期添加(@nexttime,间隔1天))在(@day1),@nexttime,日期添加(@nexttime,间隔1天);)下一次;
对于案例1和案例2:
2014-11-26 05:15:00
&
2014-11-27 05:15:00
分别是正确的val。我假设了三个不同的日期;只需一天就可以工作。将编辑.Ok.Tkanks以获得您的快速响应。如果选择了一天,那么我可以set@day1=@day2=@day3=所选的数值,并且返回预期值。现在,如果选择了2天,则返回不正确的值。仅当选择的天数大于等于3时,查询才能正常工作。