2013-05-08 2 views
4

요일을 제외하고 지정된 날짜에 날짜 차이를 가져 오려고합니다. 여기 주중 T-SQL 날짜 차이 만

내가 가진 것입니다 : 그것은 또한 주말을 계산 즉, 53.170 : 01 :

SELECT DATEADD (w, -4, GETDATE()) 

2013년 5월 4일 (19)을 반환합니다.

SELECT DATEADD (dw, -4, GETDATE()) 

어떤 도움 동일

는 이해할 수있을 것이다. 사전에

감사합니다.

쿼리 아래 혼자 주 일의 차이를 제공
+1

무엇이 필요합니까? 'Dateadd'는 날짜 차이를 반환하지 않습니다. –

+0

내 나쁜, 꽤 새로운 Tsql. 오늘 날짜를 빼고 특정 숫자를 빼고 평일을 제외해야합니다. –

+2

달력 표를 얻으십시오. –

답변

3

다음
CREATE FUNCTION [dbo].[DateDiff_NoWeekends](
    @date1 DATETIME, 
    @date2 DATETIME 
) 

RETURNS INT AS BEGIN 
    DECLARE @retValue INT 

    SET @date1 = dbo.__CorrectDate(@date1, 1) 
    SET @date2 = dbo.__CorrectDate(@date2, 0) 

    IF (@date1 >= @date2) 
     SET @retValue = 0 
    ELSE BEGIN 
     DECLARE @days INT, @weekday INT 
     SET @days = DATEDIFF(d, @date1, @date2) 
     SET @weekday = DATEPART(dw, @date1) - 1 

     SET @retValue = DATEDIFF(s, @date1, @date2) - 2 * 24 * 3600 * ((@days + @weekday)/7) 
    END 

    RETURN @retValue 
END 

GO 


CREATE FUNCTION [dbo].[__CorrectDate](
    @date DATETIME, 
    @forward INT 
) 

RETURNS DATETIME AS BEGIN 
    IF (DATEPART(dw, @date) > 5) BEGIN 

     IF (@forward = 1) BEGIN 
      SET @date = @date + (8 - DATEPART(dw, @date)) 
      SET @date = DateAdd(Hour, (8 - DatePart(Hour, @date)), @date) 
     END ELSE BEGIN 
      SET @date = @date - (DATEPART(dw, @date)- 5) 
      SET @date = DateAdd(Hour, (18 - DatePart(Hour, @date)), @date) 
     END 
     SET @date = DateAdd(Minute, -DatePart(Minute, @date), @date) 
     SET @date = DateAdd(Second, -DatePart(Second, @date), @date) 
    END 

    RETURN @date 
END 

이 아닌 모든 주말 일에 대한 sql-fiddle demo을이다 : 나는 두 날짜 사이의 비 주말의 초를 반환 이러한 기능을 사용하고 있습니다 4 월 (22).

SELECT [no weekend days in april] = 
    (dbo.DateDiff_NoWeekends('2013-04-01','2013-05-01') 
     /3600/24) 
1

는, 즉

DECLARE @StartDate DATETIME, 
    @EndDate DATETIME 
    SELECT @StartDate = '01-July-2008', 
    @EndDate = '30-July-2008' 
    ;WITH DATE (Date1) 
    AS (
    SELECT DATEADD(DAY, DATEDIFF(DAY, '19000101', @StartDate), '19000101') 
    UNION ALL 
    SELECT DATEADD(DAY, 1, Date1) 
    FROM DATE 
    WHERE Date1 < @EndDate 
    ) 

    SELECT count(*) - 
    (

    SELECT count(*) 
    --CONVERT(VARCHAR(15),d1.DATE1 ,110) as [Working Date], 
    --DATENAME(weekday, d1.Date1) [Working Day] 
    from DATE d1 where (DATENAME(weekday, d1.Date1))  in ('Saturday','Sunday') 

    ) 
    --CONVERT(VARCHAR(15),d1.DATE1 ,110) as [Working Date], 
    --DATENAME(weekday, d1.Date1) [Working Day] 
    from DATE d1 where (DATENAME(weekday, d1.Date1)) not in ('Saturday','Sunday') 

나에게 어떤 해명에 대해 알려 주시기 바랍니다 이틀 사이에는 OD 일을 계산하지 않고 주말의 어떤을 뺍니다

+0

"(토요일, 일요일)"에서 "토요일", "일요일") "로 변경했지만 감사합니다. 고마워. –

0

은 어쩌면 내가 여전히 전체 테스트를 잃었지만,이 역시 나를 위해 작동 :

DateDiff(d, d1, d2) - 2*DateDiff(wk, d1, d2) 

과 같이 함수에 넣어 될 수 있습니다 각 주말 2 일 일의 차이를 가지고 다음 빼기 잘