【问题标题】:SSIS/SQL - Convert Date/Time to String FailingSSIS/SQL - 将日期/时间转换为字符串失败
【发布时间】:2012-12-18 02:08:07
【问题描述】:

我有一个基本的 SSIS 作业,它运行 SQL 查询并将查询结果导出到 Excel 文件。 SSIS 作业已运行一年多没有问题,但本月开始失败(在验证阶段,执行前)并出现以下错误:

“从字符转换日期和/或时间时转换失败 字符串。”

SQL 查询本身是一个带有 WHERE 子句的简单 SELECT,用于指定从中收集记录的开始和结束日期范围。确定日期范围的查询部分如下:

DECLARE     @RunDateTime datetime
DECLARE     @RunDate datetime
DECLARE     @StartDate datetime
DECLARE     @EndDate datetime
DECLARE     @Month int
DECLARE     @Year int
DECLARE     @strStartDate varchar(10)

SET     @RunDateTime = GetDate()
SET     @RunDate = CAST(@RunDateTime AS DATE)

IF                  DATEPART(d, @RunDate) = 16
    BEGIN       
                    SET @StartDate =  DATEADD(d, -15, @RunDate)
                    SET @EndDate = @RunDate
    END
ELSE
    BEGIN
                    IF      Month(@RunDate) = 1
                            SET @Month = 12
                    ELSE    
                            SET @Month = Month(@RunDate) - 1

                    IF      Month(@RunDate) = 1
                            SET @Year = Year(@RunDate) - 1
                    ELSE
                            SET @Year = Year(@RunDate)

                    SET @strStartDate = CAST(@Year AS VARCHAR) + CAST(@Month AS VARCHAR) + '16'
                    SET @StartDate = CONVERT(datetime, @strStartDate)
                    SET @EndDate = @RunDate
    END

我可以将此代码从 SSIS 中取出并通过 SSMS 直接在服务器上执行,它可以正常工作,没有错误。但是,SSIS 作业无法运行它。事实上,我什至无法进入 SQL 命令的 OLE DB Source 对象并查看列元数据,每次都会出现上述错误。

我发现通过注释掉SET @StartDate = CONVERT(datetime, @strStartDate) 行,查询在SSIS 中再次起作用,但没有理由该行会引起问题。正如我所说,它已经工作了一年多,没有任何问题。我真的对此束手无策,无法理解为什么这项工作突然停止工作。

我确实与我的 DBA 确认过,他向我保证 SQL 服务器端没有任何更改,但我什至不知道该去哪里找他。

其他信息:

  • SSIS 作业正在使用 SQLNCLI10.1 连接提供程序。 (2008 R2 SQL Server)
  • 我尝试使用其他连接提供程序,但没有成功。
  • 查询中涉及的日期列是日期时间类型
  • 没有影响日期的区域/本地化更改。 (并且所有日期都是 ISO 格式)。

【问题讨论】:

  • 您是否尝试过从头开始重新创建任务?任务是否有任何可能导致问题的映射参数?
  • @DaveSexton 嗯,我还没有尝试从头开始逐步重新创建它。不过好主意,我可以试一试。我没有任何映射参数,尽管我确实有几个变量用于 excel 输出的文件复制操作。
  • @DaveSexton 不幸的是,从头开始重新创建工作给了我完全相同的错误。

标签: sql tsql datetime ssis


【解决方案1】:

这会失败,因为@strStartDate 不是有效日期或不是可识别的格式。它不应该在 11 月、12 月或 1 月失败,但肯定会在 2 月到 10 月期间失败 (Month(@RunDate) - 1),因为 CAST(@Month AS VARCHAR) 只返回一个数字。

说实话,上个月的 16 号的计算方法有点长,你能把它改成……

DECLARE @StartDate DateTime

IF DATEPART(d, GetDate()) = 16
   SET @StartDate = DateAdd(mm, DateDiff(mm,0,GetDate()),0)
ELSE
   SET @StartDate = DateAdd(mm, DateDiff(mm,0,GetDate())-1,0)+15;

简单多了

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多