4

平日を除く特定の日付の日付差を取得しようとしています。

ここに私が持っているものがあります:

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

これは2013-05-04 19:01:53.170を返します。これは、週末もカウントすることを意味します。

同じ

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

どんな助けでも大歓迎です。

前もって感謝します。

4

3 に答える 3

3

2 つの日付間の週末以外の秒を返すこれらの関数を使用しています。

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

これは、4 月 (22 日) の週末以外のすべての日のsql-fiddle デモです。

SELECT [no weekend days in april] =
    (dbo.DateDiff_NoWeekends('2013-04-01','2013-05-01')
         / 3600 / 24)
于 2013-05-08T11:22:20.213 に答える
1

以下のクエリは、平日のみの差を示します。つまり、2 つの日の間の日数をカウントし、週末の日数を差し引きます。

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

不明な点があればお知らせください

于 2013-05-08T11:18:36.903 に答える
0

まだ完全なテストを行っていない可能性がありますが、これは私にも当てはまります。日数の差を取り、週末ごとに 2 日を差し引きます。

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

関数に入れることもできます

于 2014-10-13T10:16:59.603 に答える