【问题标题】:T-SQL Date Difference for WeekDays only仅工作日的 T-SQL 日期差异
【发布时间】:2013-05-08 11:09:16
【问题描述】:

我正在尝试获取给定日期的日期差异,不包括工作日。

这是我所拥有的:

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

这将返回 2013-05-04 19:01:53.170,这意味着它也计算周末。

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

我们将不胜感激。

提前致谢。

【问题讨论】:

  • 你需要什么? Dateadd 不返回日期差异。
  • 我的错,在 Tsql 中相当新。我需要得到今天的日期减去特定数字,但不包括工作日。
  • 获取日历表。
  • 您的问题令人困惑。您是否要排除周一至周五或周六/周日?在一个地方你说“不包括工作日”,然后在另一个地方你说“它也算周末”。您是否尝试进行“n 个工作日”计算?

标签: sql-server tsql date


【解决方案1】:

我正在使用这些函数返回两个日期之间的非周末秒数:

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 demo。

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

【讨论】:

    【解决方案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')
    

    请让我知道任何澄清

    【讨论】:

    • 感谢 arun,虽然我将“在 ('Saturday','Sunday')”更改为“不在 ('Saturday','Sunday')”。非常感谢
    【解决方案3】:

    也许我仍然缺少一些完整的测试,但这也适用于我:以天为单位计算差异,然后每个周末减去 2 天

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

    也可以放在函数中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2015-06-23
      • 2021-06-02
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多