我目前使用DATE_ADD(date,INTERVAL expr type)
将截止日期设置为mySQL数据库中的触发器。SQL:DATE_ADD(日期,INTERVAL表达式类型)跳过周末
我想知道的是,如果可以跳过周末(周六,周日)作为触发器的一部分。
我目前使用DATE_ADD(date,INTERVAL expr type)
将截止日期设置为mySQL数据库中的触发器。SQL:DATE_ADD(日期,INTERVAL表达式类型)跳过周末
我想知道的是,如果可以跳过周末(周六,周日)作为触发器的一部分。
你必须创建一个自己的功能来做到这一点。例如,您可以看看如何在this answer中执行此操作(只需使用function
而不是procedure
)。至于如何编写这样的函数,here的工作算法。代码非常简单:它通过几天循环并跳过周末。
CREATE FUNCTION `DAYSADDNOWK`(addDate DATE, numDays INT) RETURNS date
BEGIN
IF (WEEKDAY(addDate)=5) THEN
SET addDate=DATE_ADD(addDate, INTERVAL 1 DAY);
END IF;
IF (WEEKDAY(addDate)=6) THEN
SET addDate=DATE_ADD(addDate, INTERVAL 1 DAY);
END IF;
WHILE numDays>0 DO
SET addDate=DATE_ADD(addDate, INTERVAL 1 DAY);
IF (WEEKDAY(addDate)=5) THEN
SET addDate=DATE_ADD(addDate, INTERVAL 1 DAY);
END IF;
IF (WEEKDAY(addDate)=6) THEN
SET addDate=DATE_ADD(addDate, INTERVAL 1 DAY);
END IF;
SET numDays=numDays-1;
END WHILE;
RETURN addDate;
END
目前SELECT DAYSADDNOWK(CURDATE(), 5)
产生2016-03-07
,这是正确的。
当然你只能用天使用它,所以,不能任意interval
,但你的问题中提到date
数据类型,而且我不太看一个人如何可以增加一个月不算工作日。
该功能简单地创建开始在参数给出的日期的日期的列表,并然后计算出该日是天的x次(间隔)的同时无视天1和7(它们分别是星期天和星期六在SQL Server上)。
CREATE FUNCTION [dbo].[udf_days_add_no_wknd]
(
@start_date date
, @interval int
)
RETURNS date
AS
BEGIN
declare @answer date
; with dates as
(
select @start_date as date_val
union all
select dateadd(d, 1, date_val) as date_val
from dates
where date_val < dateadd(d, @interval * 10, @start_date)
)
, final as
(
select top 1 lead(ld.date_val, @interval, NULL) over (order by ld.date_val asc) as new_date_val
from dates as ld
where 1=1
and datepart(dw, ld.date_val) not in (1,7) --eliminating weekends
)
select @answer = (select new_date_val from final)
return @answer
END
这是一文不值,这个解决方案是依赖于具有SQL Server 2012中或更高版本,考虑使用lead()
功能。
这个问题提到了mysql,在这种情况下这是行不通的。 –
只是为了澄清,你想修改'DATE_ADD(一些星期四,INTERVAL 3天)',以便它等于下个星期二? –
是的,这是正确的 – Danielphillips