比较用于工作的SmallDateTime的字符串

时间:2012-06-14 14:56:02

标签: sql-server-2008 sql-server-2005 vb6 type-conversion

我正在尝试在我的工作中调试旧的VB6程序。它充满了错误和硬编码的东西。

程序正在连接SQL Server 2005数据库,以使用存储过程读取和写入信息。

由于该程序在我正在使用时仍在使用,因此我对数据库进行了备份以测试某些内容并在我的SQL Server 2008版本中进行了恢复。一切正常。

当我第二天早上来的时候,我得到了一个错误,即使晚上没有使用该程序,我前一天晚上也没有。

问题:

"exec dbo.sp_Get_Wait_Data '" & DateEx & "'"

DateEx是一个包含"2012/06/14"

的字符串

存储过程:

[sp_Get_Wait_Data] @Datest as char(10)  
AS 
    SELECT
        (A lot of column names here) 
    FROM
        Fiche
    LEFT JOIN 
        voyage ON fcid = vofiche
    LEFT JOIN 
        client on fcaccount = cusnov
    WHERE
        fcdate = @Datest 
        AND (void is null or (void > 0 and (void <> 999 and               void <> 1000 and void <> 998))) 
        AND ((fcremarques NOT LIKE '%SYSANNULATION%' OR
              fcremarques IS NULL)  
        AND fcrettime IS NOT NULL)
    ORDER BY 
        FcTime, FcOrgSite, fcdessite

错误消息:

  

将varchar数据类型转换为smalldatetime数据类型导致超出范围的值

因此,存储过程中的错误是fcdate=@Datest。我尝试在存储过程中添加此行

SELECT convert(datetime, @Datest, 120)

在查询中像转换的魅力一样工作,但当其他查询尝试访问此变量时,在程序中导致了几百个其他错误,因此它不是一个选项。

任何想法为什么这个查询昨天工作得很好,现在它给了我这个错误?提前谢谢。

1 个答案:

答案 0 :(得分:4)

连接到数据库副本时,您可能有set dateformat dmy。日期格式由使用的语言隐式设置。 set language

您可以将参数的格式更改为YYYYMMDD,无论set dateformat如何都是安全的,甚至更好,将参数更改为datetime

如果这不是一个选项,您可以使用where fcdate=convert(datetime, @Datest, 111)

重写您的查询