sql-server - 获取上周五和上周五 4 周前的 SSIS 表达式

标签 sql-server date ssis expression etl

我正在寻找在 SSIS 中使用的表达式来获取最新的星期五和 4 周前的最后一个星期五。

我能够得到这个:

DATEPART( "dw", GETDATE() ) == 2 ? GETDATE() : DATEADD( "day", -( DATEPART( "dw", GETDATE() ) +1), GETDATE() )

但我不确定它是否会在下周正常工作,而且我不知道如何在 4 个星期五前使用它(我尝试添加 28,但这似乎不起作用)

enter image description here

最佳答案

好的,这里有两种方法,我认为最简单的方法是将其放入写入变量的脚本任务中。第二种是将 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/

相关文章:

sql-server - T-SQL Where 子句 Case 语句优化(StoredProc 的可选参数)

java - 如何通过命令行为jvm设置时区

date - 如何为 sanity.io 中的文档创建默认 `creationDate`?

mysql - 将 ssis 包/解决方案共享给其他人

ssis - 通过表达式在变量中设置 SSIS 包中的昨天日期

SSIS 填充日期时间格式 : "hh mm ss nnn cc yy mm dd"

sql-server - 在 SQL 查询中生成行序列号

c# - 自动化从一个文件夹中的多个 CSV 文件导出数据的过程

.net - 使用.NET复制管理对象RMO的Powershell问题

jquery - 如何在 javascript 中格式化此日期类型