首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql工作日节假日

sql工作日节假日
EN

Stack Overflow用户
提问于 2013-12-15 23:03:45
回答 3查看 14.7K关注 0票数 2

我已经在其他编码语言(Python、jQuery等)中看到过这种函数的不同版本。但不适用于SQL。我有一个过程,需要有一个日期计算,这是从创建日期的65天,但它不能包括周末或节假日。我们已经有了一个函数,它只能将工作日添加到日期中,但不能考虑假日。我们有一个holiday表,其中列出了所有的假日日期,tblHolidayDates中有一个标准日期格式的HolidayDate列。

我该怎么做呢?如果有人能为我提供一个CREATE table查询,我还会考虑只创建一个Calendar表-它所需要的只是日期、工作日和假日列。

下面我给出了增加工作日的current循环函数,但它缺少节假日。任何帮助都将不胜感激!

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2013-12-15 23:14:51

几年前,我编写了一个SQL函数来构建一个动态假日表作为表函数。链接如下:

http://www.joebooth-consulting.com/sqlServer/sqlServer.html#CalendFunc

希望这能帮上忙。

您可以通过如下SQL语句访问表函数(或您自己的假日表)来确定假日数

代码语言:javascript
复制
SELECT count(*) FROM holiday_date(2013)
WHERE holiday_date BETWEEN @fromDate AND @toDate

然后使用dateAdd()将计数与返回的日期相加。

如果您的假日恰好在周末,请将以下内容添加到WHERE子句中

代码语言:javascript
复制
   AND DatePart(dw, Holiday_date) != 1) and (DatePart(dw, holiday_date) != 7)
票数 3
EN

Stack Overflow用户

发布于 2013-12-15 23:10:01

我总是用一个静态的日期表来实现这一点,从过去的大约5年到未来的10年,每个日期都被标记为“工作日”状态,有时还会根据需要标记其他标志。以前使用MS-SL服务器时,我会通过WHILE循环快速实现这一点,我认为MySQL支持相同的语法

代码语言:javascript
复制
WHILE (condition)
BEGIN
 INSERT date
END

要创建表,请使用Enterprise Manager UI或类似于

代码语言:javascript
复制
CREATE TABLE DateTable
 (
   actual_date datetime NOT NULL,
   is_holiday bit NOT NULL
 )
票数 1
EN

Stack Overflow用户

发布于 2013-12-15 23:40:58

假设我们有一个包含列actual_date (date)is_holiday (bit)的DateTable,其中包含所有日期,并且所有工作日都有is_holiday=0:

代码语言:javascript
复制
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个工作日,跳过了假期。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20595934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档