我的SQL表中有一个字段
`OurDate (varchar(250), null)`
//sample dates
// 01/18/2018
// 05/12/2016
// 03/05/2012
我正在尝试使用RowFilter
比较该字段列中两个日期之间的表数据:
string fromDate = "{OurDate Sql column value from dropdown list}"; //01/18/2018
string toDate = "{OurDate Sql column value from dropdown list}"; //01/18/2018 (could be different, if someone doesn't want same day)
dataTable.DefaultView.RowFilter = string.Format("(CONVERT({0}, 'System.DateTime') >= #" + Convert.ToDateTime(fromDate) + "# And {0} <= #" + Convert.ToDateTime(toDate) + "# )", "OurDate");
我收到此错误:
String was not recognized as a valid DateTime.
有人可以协助我解决这个问题。
答案 0 :(得分:1)
首先,您应该确定导致转换问题的原因。
是CONVERT
表达式还是用于过滤的值。
您可以通过拆分代码并为转换添加表达式列来完成此操作:
dataTable.Columns.Add("TEST", typeof(DateTime), "CONVERT(OurDate, 'System.DateTime')");
如果此行导致错误 - 则表示问题是转换数据。 DataExpression
CONVERT
函数应基于dataTable.Locale
(which defaults to CultureInfo.CurrentCulture)
属性。
如果您的数据确实始终在&#34; MM / dd / yyyy&#34;格式设置为
dataTable.Locale = new CultureInfo("en-US");
应解决问题 - 如果表格中的数据格式不一致 - 您将无法使用RowFilter / DataExpressions解决此问题
此时您会注意到您的第二个过滤条件完全没有CONVERT。
事实上,如果您的所有数据格式正确,则整个转化步骤肤浅 - 如果RowFilter
检测到其正确的日期时间格式 - 它会自动将此转化应用于您的列。
据说.RowFilter
只接受以下格式的日期
美国&#34; MM / dd / yyyy&#34; 和&#34; yyyy / MM / dd&#34; (我猜这里被认为是不变的?)
如果您的本地格式不是其中之一Convert.ToDateTime(fromDate)
,则会导致转换失败。
由于你的字符串已经采用了一种可接受的格式 - 无论如何,调用它应该只是一次毫无意义的往返。
TL; DR:假设所有格式都正确,这应该有效:
dataTable.DefaultView.RowFilter = $"OurDate >= #{fromDate}# And OurDate <= #{toDate}#";
如果您的行具有不同的格式,那么您需要更多控制的内容 - 我建议将 LINQ to DataSet 作为最简单的方法,因为您可以使用 LINQ to DataSet 用它返回DataViews
/ DataTables
。
答案 1 :(得分:0)
尝试使用此而不是ConvertTo:
DateTime.ParseExact(myStr, "MM/dd/yyyy", CultureInfo.InvariantCulture);
我在How convert string to Datetime by a format?找到了它并稍微更改了语法以适应您的数据库值&#39;格式。
答案 2 :(得分:0)
你也可以这样使用;
我认为这比rowfilter更具可读性;
static void Main(string[] args)
{
string givenDateString = "01/26/2018";
DateTime convertedDateFromString = new DateTime();
DateTime.TryParse(givenDateString, out convertedDateFromString);
DataTable dt = new DataTable();
dt.Columns.Add("OurDate", typeof(System.DateTime));
DataRow dR = dt.NewRow();
dR["OurDate"] = DateTime.Now;
dt.Rows.Add(dR);
//way 1
var result = from d in dt.AsEnumerable().ToList()
where d.Field<DateTime>("OurDate").Date == convertedDateFromString.Date
select d;
Console.WriteLine(result.FirstOrDefault()["OurDate"].ToString());
//way 2
var result2 = from d in dt.AsEnumerable()
where d.Field<DateTime>("OurDate").Date == convertedDateFromString.Date
select d;
//result.FirstOrDefault<DataRow>[""];
Console.WriteLine(result2.FirstOrDefault<DataRow>()["OurDate"].ToString());
}