【问题标题】:SSIS expression for getting last friday and last friday 4 weeks ago获取上周五和上周五 4 周前的 SSIS 表达式
【发布时间】:2019-08-20 16:41:01
【问题描述】:

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

我得到了这个:

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

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

【问题讨论】:

  • 那么,尝试一些日期?结果如何?预期的结果?最新的平均值是上周五还是即将到来的周五?如果在星期五运行,您预计当前日期吗?
  • 该过程将在星期一(或周末,不确定)运行,但肯定不会在星期五运行,所以这不是问题。我不知道如何尝试不同的日期,(我应该更改我的服务器日期吗?)

标签: sql-server date ssis expression etl


【解决方案1】:

好的,您可以在这里采用 2 种方法,我认为最简单的一种是将其放入写入变量的脚本任务中。第二种是将 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 的声明和返回值应该已经存在,您只是在“自定义代码的开始/结束”cmets 之间插入我所拥有的内容

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 周前的周五的日期。

方法二: 该逻辑可以用 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

【讨论】:

  • 但这不适用于 SSIS,对吧?我正在尝试使用它,但它似乎在那里不起作用,也许格式错误?用于变量表达式
  • 大声笑,我误读为 SSRS,我会用 SSIS 版本回复你,虽然可能明天早上。对不起!
  • 没什么好道歉的!非常感谢您花时间帮助我,我真的很感激 :) 晚安!
  • 好的,看看这个版本,我要回家了,但我会在早上回来看看。让我知道您使用的是什么版本的 SSIS,我已经安装了几个,如果这对您不起作用,这可能会有所帮助。
  • 很高兴我能帮上忙,这个网站为我节省了几天的工作时间,我很高兴将其付诸实践 :-) 至于不让 VB 工作,它是一个强大的工具,值得探索当你有时间的时候,尝试在脚本中设置一个断点并查看你要分配的值——通常要么值不正确,变量名不准确,要么变量不正确在脚本块中标记为读/写。
【解决方案2】:

您可以使用 SQL 脚本来执行相同的操作。将执行 SQL 任务添加到您的进程。创建一个 Object 类型变量,因为您需要它来存储两个日期。

然后,如果您运行以下脚本,它将在 4 周前的上周五和周五为您提供。 (您可以通过更改天数值来选择任意周前的星期五)

(
  SELECT getdate() DateValue
  UNION ALL
  SELECT  DateValue - 1
  FROM    mycte   
  WHERE   DateValue - 1 > DATEADD(day,-34, GETDATE())
)                                                                                           
select DateValue from (
SELECT  DateValue,DATEPART(DW, DateValue) as weekday,ROW_NUMBER() over (order by datevalue desc) as Most_Recent_Friday
FROM    mycte
where DATEPART(DW, DateValue) = 6                                                        ) a where Most_Recent_Friday in (1,5)
OPTION (MAXRECURSION 0)

原来的结果是:

DateValue                       |  weekday    |   Most_Recent_Friday
2019-08-16 09:46:25.330         |  6          |   1
2019-08-09 09:46:25.330         |  6          |   2
2019-08-02 09:46:25.330         |  6          |   3
2019-07-26 09:46:25.330         |  6          |   4
2019-07-19 09:46:25.330         |  6          |   5  

从中我选择了周五第 1(最近)和周五第 5(4 周前),您可以选择作为您的要求

您将从给定查询中获得以下输出:

2019-08-16 09:46:25.330
2019-07-19 09:46:25.330

上周五将是Most_Recent_Friday = 1,4 周前的周五将是Most_Recent_Friday = 5 或者可能是 4,您可以将结果存储在创建的对象变量中并在您的流程中使用它

【讨论】:

  • 我正在尝试这种方法,我应该在 SQL 任务编辑器中创建 Object 类型变量吗?我现在为数据流任务创建了日期时间变量,稍后将使用它们,我应该在参数映射中使用它吗?
  • 您可以在您的 SSIS 包中创建对象类型变量。还有另一个 DateTime 类型的变量,或者可以使用您已经拥有的现有变量。使用 SQL 执行任务结果集中的对象类型变量将查询的输出分配给对象类型变量。那么您可以使用循环将对象类型的值分配给 DateTime 变量
  • 试图发布屏幕截图但无法发布。请记住在 SQL 执行任务编辑器的常规页面上选择结果集作为“完整结果集”
猜你喜欢
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 2021-06-11
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多