2014-09-03 28 views
0
SELECT CONVERT(VARCHAR(12), (
      datediff(ss, RIM.Createddate, Getdate()) - (
       SELECT dbo.fn_GetHolidaysAndSaturdayAndSundayCount(RIM.Createddate, Getdate()) 
       ) * 24 * 60 * 60 
      )/60/60/24) + ' Day(s) ' + ':' + CONVERT(VARCHAR(12), (
      datediff(ss, RIM.Createddate, Getdate()) - (
       SELECT dbo.fn_GetHolidaysAndSaturdayAndSundayCount(RIM.Createddate, Getdate()) 
       ) * 24 * 60 * 60 
      )/60/60 % 24) + ' Hour(s) ' 
FROM requestinstancemt RIM 

假設RIM.Createddate = '2014-08-31 23:00:00.000'。我想排除星期六和星期天以及假期,我想僅返回工作日的工作時間。兩個日期不同,美國節假日除外

該查詢只給出計數。我試圖將計數更改爲幾小時這不起作用。

+1

[兩個日期之間的數個工作日內]的可能重複(HTTP:/ /stackoverflow.com/questions/252519/count-work-days-between-two-dates) – Tanner 2014-09-03 11:06:01

+0

問題是我們必須放假,並且需要從原來的小時數中減去。 – user3619447 2014-09-03 11:18:31

+0

我建議爲日曆創建一個表格,因爲美國和英國的假期被定義爲我們可以很容易地爲將來的年份創建日曆,一旦它準備好了,我們就可以輕鬆地查詢並獲得兩個日期之間的工作日。更多詳情請參考URL http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html – 2014-09-03 11:50:10

回答

1

一種方法....

CREATE TABLE #Days (ActualDay Date, DayOf varchar(10), Holiday bit) 

INSERT #Days SELECT '9/1/2014', DATENAME(dw,'9/1/2014'), 1 
INSERT #Days SELECT '9/2/2014', DATENAME(dw,'9/2/2014'), 0 
INSERT #Days SELECT '9/3/2014', DATENAME(dw,'9/3/2014'), 0 
INSERT #Days SELECT '9/4/2014', DATENAME(dw,'9/4/2014'), 0 
INSERT #Days SELECT '9/5/2014', DATENAME(dw,'9/5/2014'), 0 
INSERT #Days SELECT '9/6/2014', DATENAME(dw,'9/6/2014'), 0 
INSERT #Days SELECT '9/7/2014', DATENAME(dw,'9/7/2014'), 0 
INSERT #Days SELECT '9/8/2014', DATENAME(dw,'9/8/2014'), 0 
INSERT #Days SELECT '9/9/2014', DATENAME(dw,'9/9/2014'), 0 
INSERT #Days SELECT '9/10/2014', DATENAME(dw,'9/10/2014'), 0 

SELECT COUNT(*) 
FROM #Days 
WHERE ActualDay BETWEEN '9/1/2014' AND '9/9/2014' 
    AND Holiday = 0 
    AND DayOf NOT IN ('Saturday', 'Sunday') 

另一個選項(從Count work days between two dates使用一些代碼)...

CREATE TABLE #Holidays (Holiday Date) 


INSERT #Holidays SELECT '1/1/14' 
INSERT #Holidays SELECT '1/20/14' 
INSERT #Holidays SELECT '2/17/14' 
INSERT #Holidays SELECT '4/18/14' 
INSERT #Holidays SELECT '5/26/14' 
INSERT #Holidays SELECT '7/4/14' 
INSERT #Holidays SELECT '9/1/14' 
INSERT #Holidays SELECT '10/13/14' 
INSERT #Holidays SELECT '11/11/14' 
INSERT #Holidays SELECT '11/27/14' 
INSERT #Holidays SELECT '12/25/14' 


DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 
DECLARE @Holidays int 
SET @StartDate = '1/1/14' 
SET @EndDate = '1/3/14' 

SELECT @Holidays = COUNT(*) FROM #Holidays WHERE Holiday BETWEEN @StartDate AND @EndDate 

SELECT 
    (DATEDIFF(dd, @StartDate, @EndDate) + 1) 
    -(DATEDIFF(wk, @StartDate, @EndDate) * 2) 
    -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) 
    -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) 
    - @Holidays 
相關問題