如何使用sql server获取当前工作日的一周中的上一个工作日

053*_*537 14 sql sql-server

我有一个ssis包,在工作日(周一至周五)运行.如果我在星期二,背景(DB)收到文件,它需要上一个工作日日期并进行一些交易.如果我在星期五运行这个工作,它必须获取星期一的日期并处理交易.

我使用以下查询来获取以前的营业日期

Select Convert(varchar(50), Position_ID) as Position_ID,
       TransAmount_Base,
       Insert_Date as InsertDate
  from tblsample
 Where AsOfdate = Dateadd(dd, -1, Convert(datetime, Convert(varchar(10), '03/28/2012', 101), 120))
Order By Position_ID
Run Code Online (Sandbox Code Playgroud)

如果我执行此查询,我将得到昨天Transactios的结果.如果我在星期一运行相同的查询,它必须获取星期五的交易而不是星期日.

Gar*_*thD 48

SELECT  DATEADD(DAY, CASE DATENAME(WEEKDAY, GETDATE()) 
                        WHEN 'Sunday' THEN -2 
                        WHEN 'Monday' THEN -3 
                        ELSE -1 END, DATEDIFF(DAY, 0, GETDATE()))
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用这样DATENAME的东西,DATEPART因为它不需要设置DATEFIRST并确保本地机器上的时间/日期设置的变化不会影响结果.最后DATEDIFF(DAY, 0, GETDATE())将删除删除GETDATE()转换为varchar的需要的时间部分(慢得多).


编辑(差不多2年)

这个答案在我的职业生涯中很早就开始了,每当它被提升时它就会让我感到懊恼,因为我不再同意使用DATENAME的情绪.

一个更加严重的解决方案是:

SELECT  DATEADD(DAY, CASE (DATEPART(WEEKDAY, GETDATE()) + @@DATEFIRST) % 7 
                        WHEN 1 THEN -2 
                        WHEN 2 THEN -3 
                        ELSE -1 
                    END, DATEDIFF(DAY, 0, GETDATE()));
Run Code Online (Sandbox Code Playgroud)

这适用于所有语言和DATEFIRST设置.


Dal*_*ian 7

此函数返回最后一个工作日,并考虑假期和周末。您将需要创建一个简单的假期表。

-- =============================================
-- Author:      Dale Kilian
-- Create date: 2019-04-29
-- Description: recursive function returns last work day for weekends and 
-- holidays
-- =============================================
ALTER FUNCTION dbo.fnGetWorkWeekday
(
    @theDate DATE
)
RETURNS DATE
AS
BEGIN

DECLARE @importDate DATE = @theDate
DECLARE @returnDate DATE
--Holidays
IF EXISTS(SELECT 1 FROM dbo.Holidays WHERE isDeleted = 0 AND @theDate = Holiday_Date)
BEGIN
SET @importDate = DATEADD(DAY,-1,@theDate);
SET @importDate = (SELECT dbo.fnGetWorkWeekday(@importDate))
END
--Satruday
IF(DATEPART(WEEKDAY,@theDate) = 7)
BEGIN
    SET @importDate = DATEADD(DAY,-1,@theDate);
    SET @importDate = (SELECT dbo.fnGetWorkWeekday(@importDate))
END
--Sunday
IF(DATEPART(WEEKDAY,@theDate) = 1)
BEGIN
    SET @importDate = DATEADD(DAY,-2,@theDate);
    SET @importDate = (SELECT dbo.fnGetWorkWeekday(@importDate))
END


RETURN @importDate;
END
GO
Run Code Online (Sandbox Code Playgroud)