C# 在C中使用Convert.ToDateTime转换SQL日期值失败
首先,我得到的错误如下: 将varchar数据类型转换为datetime数据类型导致值超出范围 我所做的是将一组数据从SQL数据库返回到datatable中,然后在c代码端运行if语句,以确定一个日期是否大于另一个日期。这在许多部署中都有效,但是在新服务器上的特定部署会导致上述错误 这是我的密码:C# 在C中使用Convert.ToDateTime转换SQL日期值失败,c#,sql-server,datetime,datetime-conversion,C#,Sql Server,Datetime,Datetime Conversion,首先,我得到的错误如下: 将varchar数据类型转换为datetime数据类型导致值超出范围 我所做的是将一组数据从SQL数据库返回到datatable中,然后在c代码端运行if语句,以确定一个日期是否大于另一个日期。这在许多部署中都有效,但是在新服务器上的特定部署会导致上述错误 这是我的密码: if ( Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString()).Date > Convert.ToDa
if
(
Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString()).Date >
Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString()).Date
)
{
... do stuff ...
}
我的理解是,在尝试执行Convert.ToDateTime时,列中转换为字符串的数据失败
然而,令人困惑的问题是,这段代码已经在其他服务器上运行,并且这个问题是孤立的。所以我知道它可能是服务器独有的,但我不知道该去哪里找
不幸的是,更改任何区域设置等都不是一个选项,所以我正在尝试找到一种解决方法
感谢您的帮助 也许你可以试试这个
if (Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString("yyyyMMdd HH:mm:ss")).Date > Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString("yyyyMMdd HH:mm:ss")).Date)
{
...do stuff...
}
也许你可以试试这个
if (Convert.ToDateTime(ds.Tables[0].Rows[0]["StartDate"].ToString("yyyyMMdd HH:mm:ss")).Date > Convert.ToDateTime(ds.Tables[0].Rows[0]["OriginalStartDate"].ToString("yyyyMMdd HH:mm:ss")).Date)
{
...do stuff...
}
基本上,您不应该首先将值转换为字符串并返回。尽可能避免字符串转换,除非这是您尝试执行的重要部分。在您的例子中,您确实对日期时间值感兴趣。它们是数据库中的DateTime,您希望它们在代码中作为DateTime值,那么为什么要引入字符串呢 您应该能够使用:
DataRow row = ds.Tables[0].Rows[0];
DateTime startDate = (DateTime) row["StartDate"];
DateTime originalStartDate = (DateTime) row["OriginalStartDate"];
if (startDate.Date > originalStartDate.Date)
{
...
}
基本上,您不应该首先将值转换为字符串并返回。尽可能避免字符串转换,除非这是您尝试执行的重要部分。在您的例子中,您确实对日期时间值感兴趣。它们是数据库中的DateTime,您希望它们在代码中作为DateTime值,那么为什么要引入字符串呢 您应该能够使用:
DataRow row = ds.Tables[0].Rows[0];
DateTime startDate = (DateTime) row["StartDate"];
DateTime originalStartDate = (DateTime) row["OriginalStartDate"];
if (startDate.Date > originalStartDate.Date)
{
...
}
数据库中日期的格式是什么?很可能日期是以一种格式记录的,而您的转换是以另一种格式运行的。数据库中的类型是什么?它应该是DateTime,这意味着您根本不应该转换为字符串并返回。只需使用if DateTime ds.Tables[0]。行[0][StartDate]>DateTime ds.Tables[0]。行[0][OriginalStartDate]双重检查两个字段的类型是否为DateTime@我将据此尝试你的建议。至于格式,它看起来像2015-07-01 00:00:00.000@MPelletierCan你能从数据库中发布一些数据,让我们看看格式是什么吗?@JonSkeet你的答案帮我整理好了!谢谢数据库中日期的格式是什么?很可能日期是以一种格式记录的,而您的转换是以另一种格式运行的。数据库中的类型是什么?它应该是DateTime,这意味着您根本不应该转换为字符串并返回。只需使用if DateTime ds.Tables[0]。行[0][StartDate]>DateTime ds.Tables[0]。行[0][OriginalStartDate]双重检查两个字段的类型是否为DateTime@我将据此尝试你的建议。至于格式,它看起来像2015-07-01 00:00:00.000@MPelletierCan你能从数据库中发布一些数据,让我们看看格式是什么吗?@JonSkeet你的答案帮我整理好了!谢谢谢谢你,乔恩。这里100%正确。我意识到在基地,我试图削减一些角落,这只是引起了我的头痛,当然字符串转换是不必要的。谢谢你的洞察力。谢谢。如果你的数据允许为空,那么我会选择DateTime?ColumnName=DateTime?dr[ColumnName]==DBNull.Value?null:dr[ColumnName];即使不允许空值,如果您以后决定更改模式以允许空值,运行此逻辑仍然是安全的。谢谢Jon。这里100%正确。我意识到在基地,我试图削减一些角落,这只是引起了我的头痛,当然字符串转换是不必要的。谢谢你的洞察力。谢谢。如果你的数据允许为空,那么我会选择DateTime?ColumnName=DateTime?dr[ColumnName]==DBNull.Value?null:dr[ColumnName];即使不允许空值,如果您以后决定更改模式以允许空值,运行此逻辑仍然是安全的。