我有一个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设置.
此函数返回最后一个工作日,并考虑假期和周末。您将需要创建一个简单的假期表。
-- =============================================
-- 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)
归档时间: |
|
查看次数: |
43907 次 |
最近记录: |