SSIS / SQL - 将日期/时间转换为字符串失败

时间:2013-01-03 17:01:12

标签: sql tsql datetime ssis

我有一个运行SQL查询的基本SSIS作业,并将查询结果导出到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)
  • 我尝试过使用其他连接提供商,但没有运气。
  • 查询中涉及的日期列的类型为datetime
  • 没有会影响日期的区域/本地化更改。 (并且所有日期都是ISO格式的)。

1 个答案:

答案 0 :(得分:2)

此操作失败,因为@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;

更容易