我怎样才能获得当月的第一个工作日? 如果没有创建功能,只需选择。 类似的东西:
SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETDATE())-1), GETDATE()), 101)
有人知道吗?
感谢。
答案 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
说明:
查找该月的第一天。
Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate())
然后使用Datename
函数检查上一日期的日期。
Datename(dw, Dateadd(dd, -Datepart(dd, Getdate()) + 1, Getdate()))
如果Datename
星期六 添加 2
天到该月的第一天。如果是sunday
,那么将 1
天添加到该月的第一天 else
获取的第一天本月