将 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;
}
第一件事是不要将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.datepushed
是datetime
字段,@date_pushed
是datetime
参数。您当然可以将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。
SQLServer 中的有效日期时间范围是 1753 年 1 月 1 日到 9999 年 12 月 31 日,如日期时间 (Transact-SQL) MSDN 页上所述。
我建议您注意所有convert(datetime, ...)
语句中超出此范围的值。