我目前使用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