2012-05-04 93 views
1

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

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; 
} 
+1

你认为我们该怎么处理这个烂摊子? – Arion

+0

@Arion这应该是更好的,但我同意 - OP不应该把他的“代码”给别人。这是非常格式化。 – Matten

+0

@Matten:你很高兴你回来了:P – Arion

回答

4

第一件事是date_pushed作为一个字符串传递。解析它在你的C#(DateTime.Parse或类似的,也许指定格式和文化),并将其作为参数传递。在所有有'" + date_pushed + '"'的地方,请改为使用@theParameter

接下来的事情是存储b.datepusheddatetime - 应该没有必要在b.datepushed使用convert。如果它是一个字符串你做错了

之后,您将datetime字段与datetime参数进行比较,该参数无任何问题。例如:

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

变得

and b.datepushed > @date_pushed 

其中b.datepusheddatetime字段,@date_pusheddatetime参数。您当然可以使用DATEPART等与datetime - 重要的一点是:它不解析任何东西。

+0

@marc_s在回答了关于日期格式的太多问题之后 - 是否有一个规范的答案,我们都可以链接为重复的?例如有400个upvotes,所以我们可以避免评论中的争论? –

0

有些一定失败,所以请看看实际值:

Convert(datetime,a.DOB,103) as DOB, 
Convert(datetime,a.DOI,103) as DOI, 
Convert(datetime,b.datepushed,103) as datepushed 
0

我假设你使用SQL Server。

SQL Server中的有效的datetime范围为1753年1月1日通过12月31日,9999,在datetime (Transact-SQL) MSDN page的规定。

我建议你看看你所有的convert(datetime, ...)声明的值落在这个范围之外。

+0

有趣!似乎这就是为什么他们在varchar字段也许:) :) – V4Vendetta

+0

@ V4Vendetta - 可能:)。如果出于某种原因,您需要表示SQL允许的范围之外的日期,那么最好的方法就是使用C#解析日期,正如Marc Gravell在他的回答中所表明的那样。 – GolfWolf

相关问题