我正在寻找在 SSIS 中使用的表达式来获取最新的星期五和 4 周前的最后一个星期五。
我能够得到这个:
DATEPART( "dw", GETDATE() ) == 2 ? GETDATE() : DATEADD( "day", -( DATEPART( "dw", GETDATE() ) +1), GETDATE() )
但我不确定它是否会在下周正常工作,而且我不知道如何在 4 个星期五前使用它(我尝试添加 28,但这似乎不起作用)
最佳答案
好的,这里有两种方法,我认为最简单的方法是将其放入写入变量的脚本任务中。第二种是将 SQL 代码嵌入到 SQL 脚本中,并将结果提取到结果集中。如果您将其用作另一个数据流的输入,那么第二个可能值得探索,但我将专注于第一个,因为它更容易(至少对我来说)。所以就这样吧。
方法一:
步骤 1) 从 2 个变量开始,均为 DateTime 类型。我将我的命名为 User::varLastFriday 和 User::var4FriAgo,但您可以将它们命名为任何您想要的名称。请记住,与大多数 SQL 和 Visual Studio 不同,它们区分大小写!
步骤 2) 创建“脚本任务”。请注意,有许多听起来类似的任务,这是一个描述为“执行标准集成服务任务未提供的功能。...”的任务。
第 3 步)编辑您的脚本,将“语言”设置为 Microsoft Visual Basic(要使用我的示例,如果您更舒服,您可以在 C 中执行相同操作),无论您的编辑器是哪一年,我都使用2015 年,但其他版本应该类似,2008 年至少是相同的。
第 4 步)仍然在脚本属性中,下拉“读/写变量”并检查这两个变量,如果此处未选择它们,则无法更新它们。
步骤 5) 仍然在脚本属性中,单击“编辑脚本”按钮,它将打开一个带有框架项目的 Visual Studio 窗口。您将修改“Main”过程中的代码。这是代码。请注意,Main 的声明和返回值应该已经存在,您只需在“自定义代码的开始/结束”注释之间插入我所拥有的内容
Public Sub Main()
'Start of my custom code
Dim nDayOfWeek As Integer = DatePart(DateInterval.Weekday, Now)
Dim nOffset As Integer = 0
If nDayOfWeek >= 6 Then
nOffset = 6 - nDayOfWeek
Else
nOffset = -1 - nDayOfWeek
End If
Dts.Variables("User::varLastFriday").Value = DateAdd(DateInterval.Day, nOffset, Now)
Dts.Variables("User::var4FriAgo").Value = DateAdd(DateInterval.Day, nOffset - 28, Now)
'End of my custom code
Dts.TaskResult = ScriptResults.Success
End Sub
步骤 6) 保存脚本,保存任务,并将任务连接到其他步骤,以便它首先运行。它很快,但你不想要竞争条件
就是这样,当您运行它时,它会分别使用上周五和 4 周前周五的日期更新这两个变量。
方法2: 逻辑可以用 SQL 编写并放入“执行 SQL 任务”中,您可以在其中从结果集中获取结果。我很难让这种方法发挥作用,我通常可以花很多时间让它最终发挥作用,但如果你想走这条路,你最好得到其他人的帮助。这是将生成日期的代码,但它至少会给您一个开始。
--DECLARE @TestDate DATE = '2019-08-21'
DECLARE @TestDate DATE = GETDATE()
--08-23 is Friday, WEEKDAY 6, 25 is Sunday Weekday 1
--use GETDATE for today
DECLARE @LastFri DATE
-- >=6 means running on Friday returns today,
--use >6 if you want running on Friday to return last friday
SET @LastFri = DATEADD(day, IIF(DATEPART(WEEKDAY, @TestDate) >= 6
,6-DATEPART(WEEKDAY, @TestDate)
,-1-DATEPART(WEEKDAY, @TestDate)),@TestDate)
SELECT @TestDate as IfDayIs , @LastFri as ThenLastFriIs, DATEADD(day, -28, @LastFri ) as Fri4Ago
--Fridays in August: 30, 23, 16, 9, 2 July: 26, 19, 12
关于sql-server - 获取上周五和上周五 4 周前的 SSIS 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57578138/