当月的第一个工作日-SQL Server
如何获得当月的第一个工作日? 如果不创建函数,则仅选择。 诸如此类:当月的第一个工作日-SQL Server,sql,sql-server,Sql,Sql Server,如何获得当月的第一个工作日? 如果不创建函数,则仅选择。 诸如此类: SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETDATE())-1), GETDATE()), 101) 有人知道吗 谢谢。如果您在SELECT语句中有更多的灵活性,您可能可以使用以下内容: ;With Daterange As ( Select DateAdd(Month, DateDiff(Month, 0, GetDate()), 0) As Date Union
SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETDATE())-1), GETDATE()), 101)
有人知道吗
谢谢。如果您在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(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 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
说明:
找到一个月的第一天
Dateadddd,-Datepartdd,Getdate+1,Getdate
然后使用Datename函数检查上一个日期的日期
Datenamedw,Dateadddd,-Datepartdd,Getdate+1,Getdate
如果Datename为Saturday,则在每月的第一天添加2天。如果是星期天,则在每月的第一天加上1天,否则取每月的第一天
如果我们将一个工作日定义为非周六或周日的任何一天,那么这将真正满足您的要求——一个月的第一个工作日。但这是一个非常狭隘的工作日定义,在考虑假期和文化差异时并不合适,因此它的概括性很差。这个问题的典型解决方案是创建一个表,实际保存一年前某个地方生成的工作日,或者如果可行的话提前计算,然后在该表中查找
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避免任何语言问题-使用DATEPARTWEEKDAY。。。仅当我们假设某个特定地区时,名称本身或日期才起作用。如果1月1日是星期一,那么这算是第一个工作日吗?这取决于当前地区等。即使在一个国家内部,也有不同的工作日,例如德国,不同的联邦各州有不同的公共假日。你首先需要定义什么是工作日是的,在这种情况下我只想不算星期天和星期六。。假期不重要。只需输入我的.02,但我认为一个日期表在这里会对你有很大帮助。此外,商务日历对于一个企业来说是独一无二的。在我工作的地方,我们使用修改后的445个4周、4周、5周会计日历。在SQLDBF中,我们有一个简单的控制表,它定义了所有会计期间。因此,当1月1日是上一年的最后一个会计期间时,没有数学问题,没有闰年错误,也没有意外问题。总之,只需将所需日期列成一张表即可。