1

我收到以下错误“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。” 日期格式为“DD/MM/YY”

    public DataSet GetSynchronizeDataForDLDocs(string date_pushed)
{
    DataSet ds = new DataSet();
    string strQuery=string.Empty;

    if (date_pushed != null && date_pushed != string.Empty)                 // 105
         strQuery = 
            @"select 
                a.DLNO,
                a.NAME,
                b.TOPSTRING,
                Convert(datetime,a.DOB,103) as DOB,
                Convert(datetime,a.DOI,103) as DOI,
                Convert(datetime,b.datepushed,103) as datepushed 
            from 
                PLInfo_Demo a,
                DLInfo_Demo b 
            where 
                a.dlno=b.dlno 
            and
                Convert(DateTime,b.datepushed,103) > CONVERT(varchar,'" + date_pushed + @"' ,103)
            and 
                DATEPART(hh, b.datepushed) > Datepart(hh,'" + date_pushed + @"') 
            and
                DATEPART(MI, b.datepushed) > Datepart(MI,'" + date_pushed + @"' ) 
            and
                DATEPART(ss, b.datepushed) > Datepart(ss,'" + date_pushed + @"' ) 
            order by b.datepushed desc";
    else
         strQuery = @"
            select 
                a.DLNO,
                a.NAME,
                b.TOPSTRING,
                Convert(datetime,a.DOB,103) as DOB,
                Convert(datetime,a.DOI,103) as DOI,
                Convert(datetime,b.datepushed,103) as datepushed 
            from 
                PLInfo_Demo a,
                DLInfo_Demo b
            where 
                a.dlno=b.dlno ";
    ds = DbManager.ExecuteSalarData(
        strQuery, 
        CommandType.Text, 
        DbManager.strcon2, 
        null);

    return ds;
}
4

3 回答 3

4

首先不要date_pushed作为字符串传入。在您的 c# 中解析它(DateTime.Parse或类似的,可能指定格式和文化),并将其作为参数传递。在您拥有的所有地方'" + date_pushed + '"',请@theParameter改用。

接下来就是存储b.datepushed为 a datetime- 应该不需要使用converton b.datepushed。如果它是一个字符串,你做错了

之后,您将datetime字段与datetime参数进行比较,这将毫无问题地工作。例如:

and Convert(DateTime,b.datepushed,103) > CONVERT(varchar,'" + date_pushed + @"' ,103)

变成

and b.datepushed > @date_pushed

whereb.datepusheddatetime字段,@date_pusheddatetime参数。您当然可以将DATEPARTetc 与datetime- 一起使用,重点是:它根本不解析任何内容。

于 2012-05-04T06:36:15.317 回答
0

其中一些肯定失败了,所以请查看实际值:

Convert(datetime,a.DOB,103) as DOB,
Convert(datetime,a.DOI,103) as DOI,
Convert(datetime,b.datepushed,103) as datepushed 
于 2012-05-04T06:37:30.797 回答
0

我假设您使用 SQL Server。

SQL Server 中的有效日期时间范围是1753 年 1 月 1 日9999 年 12 月 31 日,如datetime (Transact-SQL) MSDN page所述。

我建议你注意你所有的convert(datetime, ...)陈述是否有超出这个范围的值。

于 2012-05-04T06:37:39.617 回答