我已经看到这种函数的不同版本用于其他编码语言(Python,jQuery等)但不适用于SQL。我有一个程序需要计算的日期是从创建日期起65天,但它不能包括周末或假期。我们已经有一个功能,只能在一个日期添加工作日,但不考虑假期。我们有一个假期表,列出了所有假日日期,tblHolidayDates以及标准日期格式的HolidayDate列。
我该怎么做?我也可以考虑创建一个Calendar表,如果有人可以给我一个CREATE TABLE查询 - 它只需要日期,工作日和假日列。
下面我给出了当前的循环功能,它增加了工作日,但却没有假期。任何帮助将不胜感激!!
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
答案 0 :(得分:3)
我几年前写了一个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)
答案 1 :(得分:0)
我总是通过一个静态的日期表来实现这个目标,从过去的大约5年到将来的10年,每个日期都标有“工作日”状态,有时还需要其他标志。以前使用MS-SL服务器我会用WHILE循环快速实现这一点,我认为MySQL支持相同的语法
WHILE (condition)
BEGIN
INSERT date
END
要创建表,请使用企业管理器UI或类似
CREATE TABLE DateTable
(
actual_date datetime NOT NULL,
is_holiday bit NOT NULL
)
答案 2 :(得分:0)
假设我们有一个包含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个工作日,不用假期。