首页 文章

SSIS将datetime变量更改为其他格式

提问于
浏览
4

我的SSIS包中有一个ADO.NET Source,我试图进行以下查询:

“SELECT * FROM Table WHERE DateAdded>'@ [User :: InputDateV]'”

另一方面,我有一个名为InputDateV的DateTime变量 .

我的问题是,在变量值我可以使用以下日期:24/10/2012但我的Sql服务器此日期无效,应该是10/24/2012 .

我如何才能将变量的日期时间格式更改为(mm / dd / yyyy)?

谢谢 .

问候 .

何塞 .

3 回答

  • 0

    最安全的做法是将DateTime变量转换为ISO日期格式:

    "'" + (DT_WSTR,4)YEAR(@[User::InputDateV]) 
        + RIGHT("0" + (DT_WSTR,2)MONTH(@[User::InputDateV]),2)
        + RIGHT("0" + (DT_WSTR,2)DAY(@[User::InputDateV]),2) 
        + "'"
    

    这将评估为“20121024”,因此是SQL Server的完美,明确的日期字符串 .

  • 3

    datetime数据类型没有格式 . 当您将其转换为字符串类型,然后是,您可以应用区域设置感知格式,但在内部日期时间与区域设置无关 .

    我将使用ADO.NET源代码的前言比OLE对应程序更令人痛苦 .

    在我的复制中,我有一个执行SQL任务,它创建一个表并在其中粘贴一些数据 . 然后它路由到数据流任务 .

    enter image description here

    在我的数据流中,我从 SELECT T.* FROM dbo.[Table] AS T 的查询开始 . 目前没有WHERE子句 . 这是为了允许数据流组件注册源查询的元数据 .

    enter image description here

    要对其进行参数化,您需要返回到控制流级别 . 选择“数据流任务”,在“属性”下,需要为ADO NET源的SqlCommand属性添加表达式 .

    根据我的经验,可以更好地为变量构建表达式并将变量分配给Task的属性而不是在Task本身中创建它 . 如果没有其他原因,这种方法允许您设置断点并查看您的本地人并直观地检查该值 . 这不能在对象的表达式上完成 - 特别是如果所述表达式导致包失败 .

    为此,您将看到我在SSIS包中定义了两个变量 .

    • InputDateV - 数据类型是DateTime,它的值为 10/24/2012 12:01 AM 我添加了一个时间组件,只是为了显示它,但你可以根据需要去除它 .

    • 查询 - 数据类型为String . 这个变量的属性是EvaluateAsExpression = True而Expression是 "SELECT T.* FROM dbo.[Table] T WHERE T.DateAdded > '" + (DT_WSTR, 24)@[User::InputDateV] + "'" 这里我强制将语言环境不可知的datetime值转换为语言环境感知类型,但因为它's through the magic of .NET code, it'll工作 .

    然后我使用@ [User :: Query]配置[ADO NET Source] . [SqlCommand]并且神奇地说,一切正常 .

    在关闭机会时,我误解了你上面关于你的变量名的定义 . 如果@ [User :: InputDateV]实际上是一种String类型,那么以上内容对你不起作用 . 我创建了一个变量@ [User :: InputDateS]的数据类型字符串,并为其赋值 24/10/2012 . 如果我修改@ [User :: Query]表达式以使用它,SQL Server将拒绝它,因为它无法将该值转换为日期时间数据类型 . 因此,使SSIS表达式执行转换 . 修改@ [User :: Query]上的表达式为 "SELECT T.* FROM dbo.[Table] T WHERE T.DateAdded > '" + (DT_WSTR, 24)((DT_DATE) @[User::InputDateS]) + "'" ,Bob是你叔叔的绿色方框 .

    参考

  • 1

    您可以拥有SSIS字符串变量并以“mm / dd / yyyy”格式保存该值 . 传递给准备查询的值具有单引号('),因此可以使用 . 如果要使用SSIS日期时间进行维护,请使用System.DateTime使用脚本组件准备查询,如下所示 . 那么你的查询将准备好 . 希望这可以帮助 .

    public void Main()
    {
      // Map your variable using Dts.Variables["NameOfDateTimeVariable"].Value
      DateTime dt= DateTime.Now;
    
      var dateTime = string.Format("{0:mm/dd/yyyy}",dt);
    
      var query = string.Format("SELECT * FROM Table WHERE DateAdded > '{0}'",dateTime);
    
      //Map the query to your variable if you want
    
     Dts.TaskResult = (int)ScriptResults.Success;
    }
    

    谢谢,Gowdhaman

相关问题