2013-05-08 26 views
4

我想在排除星期幾的給定日期中獲取日期差異。僅適用於星期幾的T-SQL日期差異

以下是我有:

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

這將返回2013年5月4日19:01:53.170,這意味着它也算週末。

同爲

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

任何幫助將不勝感激。

在此先感謝。

+1

你需要什麼? 'Dateadd'不返回日期差異。 – 2013-05-08 11:13:17

+0

我的不好,Tsql很新。我需要獲得今天的日期減去特定的數字,但不包括平日。 – 2013-05-08 11:17:31

+2

獲取日曆表。 – 2013-05-08 11:18:23

回答

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四月(22)。

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

下面的查詢給出了單獨工作日之差,即計算兩次天之間沒有OD天,減去沒有周末,

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') 

請讓我知道任何澄清

+0

謝謝阿倫,儘管我在('星期六','星期天')「改變爲」不在('星期六','星期天')「。非常感謝 – 2013-05-08 11:22:29

0

也許我仍然缺少一些完整的測試,但是這也爲我的作品:走差異化的天,然後減去2天,每個週末

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

可以放在一個功能井