我已经在其他编码语言(Python、jQuery等)中看到过这种函数的不同版本。但不适用于SQL。我有一个过程,需要有一个日期计算,这是从创建日期的65天,但它不能包括周末或节假日。我们已经有了一个函数,它只能将工作日添加到日期中,但不能考虑假日。我们有一个holiday表,其中列出了所有的假日日期,tblHolidayDates中有一个标准日期格式的HolidayDate列。
我该怎么做呢?如果有人能为我提供一个CREATE table查询,我还会考虑只创建一个Calendar表-它所需要的只是日期、工作日和假日列。
下面我给出了增加工作日的current循环函数,但它缺少节假日。任何帮助都将不胜感激!
ALTER FUNCTION [dbo].[AddWorkDaysToDate]
(
@fromDate datetime,
@daysToAdd int
)
RETURNS datetime
AS
BEGIN
DECLARE @toDate datetime
DECLARE @daysAdded integer
-- add the days, ignoring weekends (i.e. add working days)
set @daysAdded = 1
set @toDate = @fromDate
while @daysAdded <= @daysToAdd
begin
-- add a day to the to date
set @toDate = DateAdd(day, 1, @toDate)
-- only move on a day if we've hit a week day
if (DatePart(dw, @toDate) != 1) and (DatePart(dw, @toDate) != 7)
begin
set @daysAdded = @daysAdded + 1
end
end
RETURN @toDate
END发布于 2013-12-15 23:14:51
几年前,我编写了一个SQL函数来构建一个动态假日表作为表函数。链接如下:
http://www.joebooth-consulting.com/sqlServer/sqlServer.html#CalendFunc
希望这能帮上忙。
您可以通过如下SQL语句访问表函数(或您自己的假日表)来确定假日数
SELECT count(*) FROM holiday_date(2013)
WHERE holiday_date BETWEEN @fromDate AND @toDate然后使用dateAdd()将计数与返回的日期相加。
如果您的假日恰好在周末,请将以下内容添加到WHERE子句中
AND DatePart(dw, Holiday_date) != 1) and (DatePart(dw, holiday_date) != 7)发布于 2013-12-15 23:10:01
我总是用一个静态的日期表来实现这一点,从过去的大约5年到未来的10年,每个日期都被标记为“工作日”状态,有时还会根据需要标记其他标志。以前使用MS-SL服务器时,我会通过WHILE循环快速实现这一点,我认为MySQL支持相同的语法
WHILE (condition)
BEGIN
INSERT date
END要创建表,请使用Enterprise Manager UI或类似于
CREATE TABLE DateTable
(
actual_date datetime NOT NULL,
is_holiday bit NOT NULL
)发布于 2013-12-15 23:40:58
假设我们有一个包含列actual_date (date)和is_holiday (bit)的DateTable,其中包含所有日期,并且所有工作日都有is_holiday=0:
SELECT actual_date from
(
SELECT actual_date, ROW_NUMBER() OVER(ORDER BY actual_date) AS Row
FROM DateTable
WHERE is_holiday= 0 and actual_date > '2013-12-01'
) X
WHERE row = 65这将发现2013-12-01加上65个工作日,跳过了假期。
https://stackoverflow.com/questions/20595934
复制相似问题