2013-05-08 24 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) 

可以放在一个功能井