我在数据库中有一个名为compare_time
(数据类型:DateTime
)的列。其值插入为3/8/2017 12:09:08 AM
。现在在c#中我想写一个查询来比较这个列值是否等于新加坡当前的日期时间。(只需要比较日期。)。目前的新加坡日期时间为08-03-2017 PM 03:35:11
。
TimeZone time2 = TimeZone.CurrentTimeZone;
DateTime test = time2.ToUniversalTime(DateTime.Now);
var singapore = TimeZoneInfo.FindSystemTimeZoneById("Singapore Standard Time");
var singaporetime = TimeZoneInfo.ConvertTimeFromUtc(test, singapore);
DateTime dt = Convert.ToDateTime(singaporetime); //08-03-2017 PM 03:35:11.
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM time_details where compare_time='"+dt+"' ", con1);
请帮助纠正where子句。
答案 0 :(得分:0)
第一步是不使用自动字符串转换比较日期,而是使用参数 仍然这还不够,因为您的DateTime变量还包含时间部分以及数据库列。因此,您需要在数据库数据和变量
中隔离日期部分DateTime dt = Convert.ToDateTime(singaporetime); //08-03-2017 PM 03:35:11.
SqlDataAdapter adapter = new SqlDataAdapter(@"SELECT * FROM time_details
where Convert('Date',compare_time) = @date", con1);
adapter.SelectCommand.Parameters.Add("@date", SqlDbType.DateTime).Value = dt.Date;
....
通过这种方式,你不要让编译器决定哪个是正确的字符串'格式'这对于Sql Server来理解您的查询是正确的 相反,您将DateTime变量作为日期(使用不具有有意义时间部分的Today属性)传递给数据库引擎,该数据库引擎现在具有进行正确比较的所有信息。
请注意,这种方法不是最有效的方法。 WHERE子句中的CONVERT可能会对您的索引造成严重破坏。可能你可以使用不同的方法
string cmdText = @"SELECT * FROM time_details
where compare_time >= @init AND
compare_time < @end";
SqlDataAdapter adapter = new SqlDataAdapter(cmdText, con1);
adapter.SelectCommand.Parameters.Add("@init", SqlDbType.DateTime).Value = dt.Date;
adapter.SelectCommand.Parameters.Add("@end", SqlDbType.DateTime).Value = dt.Date.AddDays(1);