如何获取当月的第一个工作日?不创建函数,只选择。像这样:
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
解释:
查找该月的第一天。
Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate())
然后使用
Datename
功能检查前一天的日期。Datename(dw, Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate()))
如果
Datename
是星期六,则在每月的第一天添加2
天。 如果是sunday
则将1
天添加到该月的第一天else
得到该月的第一天