Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当月的第一个工作日-SQL Server_Sql_Sql Server - Fatal编程技术网

当月的第一个工作日-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日是上一年的最后一个会计期间时,没有数学问题,没有闰年错误,也没有意外问题。总之,只需将所需日期列成一张表即可。