当月的第一个工作日 - SQL Server

时间:2014-11-24 16:46:37

标签: sql sql-server

我怎样才能获得当月的第一个工作日? 如果没有创建功能,只需选择。 类似的东西:

SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETDATE())-1), GETDATE()), 101)
有人知道吗?

感谢。

4 个答案:

答案 0 :(得分:6)

简单的案例陈述可以做到

SELECT CASE 
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, getdate()), 0)) = 'Saturday'
            THEN dateadd(mm, DATEDIFF(MM, 0, getdate()), 0) + 2
        WHEN DATENAME(WEEKDAY, dateadd(mm, DATEDIFF(MM, 0, getdate()), 0)) = 'Sunday'
            THEN dateadd(mm, DATEDIFF(MM, 0, getdate()), 0) + 1
        ELSE dateadd(mm, DATEDIFF(MM, 0, getdate()), 0)
        END

答案 1 :(得分:2)

这将真正为您提供您所要求的内容 - 如果我们将工作日定义为"任何一天不是周六或周日,那么这是一个月中的第一个工作日&# 34 ;.但这是一个非常狭窄的定义"工作日"考虑到假期和文化差异时这是不合适的,所以它概括得很差。这个问题的典型解决方案是创建一个实际保存工作日的表(在一年之前的某个地方生成,或者如果可行则提前计算),并简单地查看它。

SELECT DATEADD(DAY,
    CASE
        (DATEPART(WEEKDAY, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) + @@DATEFIRST - 1) % 7
        WHEN 6 THEN 2 
        WHEN 7 THEN 1
        ELSE 0
    END,
    DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
)

此解决方案使用@@DATEFIRST来避免任何语言问题 - 单独使用DATEPART(WEEKDAY, ...)DATENAME()仅在我们假定特定区域时才有效。

答案 2 :(得分:0)

如果您在SELECT声明中有更多灵活性,则可以使用以下内容:

;With Daterange As
(
    Select  DateAdd(Month, DateDiff(Month, 0, GetDate()), 0) As Date Union All
    Select  DateAdd(Day, 1, Date) As Date
    From    DateRange
    Where   Date < DateAdd(Day, 6, DateAdd(Month, DateDiff(Month, 0, GetDate()), 0))
)
Select  Convert(Date, Min(Date)) FirstBusinessDay 
From    Daterange 
Where   DatePart(WeekDay, Date) Not In (7, 1)

答案 3 :(得分:0)

试试这个。

SELECT CASE
         WHEN Datename(dw, Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate())) = 'Saturday' THEN Dateadd(dd, -Datepart(dd, Getdate()) + 3, Getdate())
         WHEN Datename(dw, Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate())) = 'Sunday' THEN Dateadd(dd, -Datepart(dd, Getdate()) + 2, Getdate())
         ELSE Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate())
       END 

说明:

  1. 查找该月的第一天。

    Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate())

  2. 然后使用Datename函数检查上一日期的日期。

    Datename(dw, Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate()))

  3. 如果Datename 星期六 添加 2天到该月的第一天。如果是sunday,那么 1天添加到该月的第一天 else获取的第一天本月

相关问题