将 varchar 数据类型转换为日期时间数据类型会导致值超出范围

本文关键字:范围 数据类型 数据 varchar 类型转换 时间 日期 | 更新日期: 2023-09-27 18:33:04

我收到以下错误"将 varchar 数据类型转换为日期时间数据类型导致值超出范围",日期格式为"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;
}

将 varchar 数据类型转换为日期时间数据类型会导致值超出范围

第一件事是不要将date_pushed作为字符串传入。在 c# 中分析它(DateTime.Parse或类似,可能指定格式和区域性),并将其作为参数传递。在'" + date_pushed + '"'的所有位置,请改用@theParameter

接下来是将b.datepushed存储为datetime - 无需在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一起使用 - 重要的一点是:它根本不解析任何内容。

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

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

我假设你使用SQL Server。

SQL

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

我建议您注意所有convert(datetime, ...)语句中超出此范围的值。

相关文章: