2013-12-15 157 views
1

我已經看到了其他編程語言(Python,jQuery等)的這種函數的不同版本,但不適用於SQL。我有一個程序需要計算一個從創建日期起65天的日期,但不能包括週末或節假日。我們已經有了一個功能,只能將日期添加到日期,但不會考慮假期。我們有一個假日表,列出所有假期日期,tblHolidayDates包含標準日期格式的列HolidayDate。sql工作日假期

我該怎麼做?我想也許只是創建一個日曆表,如果有人可以給我一個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

我刪除了MySQL標記,因爲該問題使用SQL Server語法。 –

+0

如果您決定創建日曆表,則應放棄假期表。這樣你只有一套數據要維護。你不需要一個星期幾的列,因爲你可以使用datepart()來獲取它。您可能需要稍後添加會計年度/期間/季度字段。 –

回答

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 
) 
+0

日期表的日期時間數據類型不合適。 OP正在使用具有可用日期數據類型的sql server。另外,如果您要存儲假日信息,存儲假日名稱比位函數更有用。從我減去1。 –

+0

當然很多將取決於使用情況,但我認爲原始帖子未被標記爲MS SQL Server,並且當然沒有附加任何版本:2008年之前,沒有單獨的「日期」數據類型,而且我也沒有確定是否所有版本的MySQL都支持這種類型。對於大多數使用場景,存儲分配的差異不會過大,但對於MS SQL Sever 2008及更高版本,您當然是正確的,Date是更好的選擇。問題是關於創建一個日曆表,它需要指示工作日,而不是標籤,所以我認爲有點標誌比標籤更有用? – Dave

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) 
+0

這太棒了!對於我正在開發的一個項目,能夠使用自定義假期幫助了很多! – Mike

+0

很高興幫助邁克,總是感覺更好的辦法來處理假期。 – Sparky

0

假設我們有一個DateTable的列actual_date (date)is_holiday (bit),包含所有日期,所有工作日都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個工作日,跳過節假日。

+0

不錯的想法,但似乎並不奏效(ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效,除非還指定了TOP或FOR XML) – Steve

+0

@Steve - 但ORDER BY只在OVER()子句中是必需的(並且是允許的)。刪除第二個ORDER BY後,查詢現在可以在SQL Server中正確執行。 –