【问题标题】:Getting tough expression in SSIS conditional split在 SSIS 条件拆分中获得强硬的表达
【发布时间】:2013-01-02 08:24:23
【问题描述】:

有人知道如何实现这个要求吗?开始日期总是比结束日期早 73 小时。虽然结束日期将是最近的上午 8 点,但它绝对是过去的日期时间。我想使用表达式进行条件拆分。
场景:
包运行的日期时间:24/12/12 0900
开始日期:21/12/12 0700
结束日期:24/12/12 0800

打包运行的日期时间:25/12/12 2300
开始日期:22/12/12 0700
结束日期:25/12/12 0800

包运行的日期时间:26/12/12 0759
开始日期:22/12/12 0700
结束日期:25/12/12 0800

包运行的日期时间:26/12/12 0800
开始日期:22/12/12 0700
结束日期:25/12/12 0800

包运行的日期时间:26/12/12 0805
开始日期:23/12/12 0700
结束日期:26/12/12 0800

如您所见,我希望将数据从我的问题包含到我的 73 小时内的分期跨度。我想要 73 小时的事件数据。所以 EVENT_D + EVENT_T 应该在 Startdate 和 Enddate 之间

我尝试过的:

    (DT_DBTIMESTAMP)(EVENT_D + " " + EVENT_T) >= DATEADD("HH",-73,GETDATE()) && (DT_DBTIMESTAMP)(EVENT_D + " " + EVENT_T) <= DATEADD("HH",8,(DT_DBDATE)(GETDATE()))

它没有给我我想要的。到目前为止,我所尝试的只是 73 小时前给我的。不是我想要的。迫切需要指导。我正在使用 SSIS 2005。
提前致谢,
10e5x

【问题讨论】:

    标签: sql-server expression ssis


    【解决方案1】:

    这是一种过于复杂的简单表达式逻辑,使我不得不使用脚本任务 - 由于您使用的是 SSIS 2005,因此必须用 VB.NET 编写:

    Public Sub Main()
        Dim runDate As DateTime = CDate(Dts.Variables("RunDate").Value)
        Dim startDate As DateTime
        Dim endDate As DateTime
    
        ' Set the end date to be 8AM on the run date
        endDate = New DateTime(runDate.Year, runDate.Month, runDate.Day).AddHours(8)
        If runDate <= endDate Then
            ' Use yesterday for the end date
            endDate = endDate.AddDays(-1)
        End If
        startDate = endDate.AddHours(-73)
        Dts.Variables("StartDate").Value = startDate
        Dts.Variables("EndDate").Value = endDate
        Dts.TaskResult = Dts.Results.Success
    End Sub
    

    如果不明显,StartDateEndDate 都是您添加到脚本任务的 ReadWriteVariables 集合的包变量。

    【讨论】:

    • 嗨,想知道你是否在那里。实际上我的'73'应该使用一个包变量,它的值来自db。那么我可以将 -73 替换为 @maxHrs 吗?在 db maxHrs 中是 varchar。
    • 嗨,我试过你的,但我对可变部分很困惑。我是 SSIS 的新手。我收到此错误:在集合中找不到该元素。当您在执行包期间尝试从容器上的集合中检索元素并且该元素不存在时,会发生此错误。在 Microsoft.SqlServer.Dts.Runtime.Variables.get_Item(对象索引) 在 ScriptTask_1e93d3b55b1647d492d0128648ff5f8a.ScriptMain.Main()
    • 我设法解决了错误,但逻辑有问题,仍在测试中
    【解决方案2】:

    在 TSQL 中尝试以下逻辑:

    DECLARE @DATE DATETIME, @END_DATE DATETIME, @START_DATE DATETIME;
    
    SET     @DATE = '2012-12-26 08:00:00'
    
    SELECT  @END_DATE = CASE WHEN @DATE > DATEADD(HOUR,8,CAST(CAST(@DATE     AS DATE) AS DATETIME))
                             THEN DATEADD(HOUR,8,CAST(CAST(@DATE     AS DATE) AS DATETIME))
                             ELSE DATEADD(HOUR,8,CAST(CAST(@DATE - 1 AS DATE) AS DATETIME))
                        END;
    
    SELECT  @START_DATE = DATEADD(HOUR,-73, @END_DATE);
    SELECT  @START_DATE, @END_DATE;
    

    一旦您正确处理了边界案例,将其转换为 SSIS 应该完全没有问题。

    【讨论】:

    • 对不起,我对 ssis 很陌生,实际上我已经有一个 tsql 解决方案,但我不知道如何在 SSIS 中实现它。我会弄清楚并尝试你的解决方案
    • 这也可以,谢谢,但我更喜欢在脚本上执行,有条件拆分来调用声明的变量
    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多