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



如何获取当月的第一个工作日?不创建函数,只选择。像这样:

SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETDATE())-1), GETDATE()), 101)

有人知道吗?

谢谢。

一个简单的案例语句就可以做到

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

这将从字面上为您提供您想要的内容 - 如果我们将工作日定义为"不是星期六或星期日的任何一天",则一个月中的第一个工作日。但这是对"工作日"的一个非常狭隘的定义,在考虑到假期和文化差异时是不合适的,所以概括性很差。此问题的典型解决方案是创建一个实际保存工作日的表(该表是在他一年之前的某个地方生成的,或者如果可行的话,可以提前计算),然后简单地在其中查找它。

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()有效。

如果你在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)

试试这个。

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得到该月的第一天

最新更新