2016-02-27 206 views

回答

1

你必须创建一个自己的功能来做到这一点。例如,您可以看看如何在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数据类型,而且我不太看一个人如何可以增加一个月不算工作日。

0

该功能简单地创建开始在参数给出的日期的日期的列表,并然后计算出该日是天的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()功能。

+0

这个问题提到了mysql,在这种情况下这是行不通的。 –

相关问题