【问题标题】:Compare datetime column with datetime variable in asp.net sql where clause将日期时间列与 asp.net sql where 子句中的日期时间变量进行比较
【发布时间】:2017-03-08 08:38:28
【问题描述】:

我在数据库中有一个名为 compare_time(datatype: 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 子句。

【问题讨论】:

    标签: c# asp.net sql-server datetime


    【解决方案1】:

    第一步是不使用自动字符串转换来比较日期,而是使用参数。
    这仍然不够,因为您的 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);
    

    【讨论】:

    • 显示:正在使用的 SQL Server 版本不支持数据类型“日期”。
    • 好的,改成SqlDbType.DateTime。重要的一点是 DateTime 变量 dt 的值。如果我们使用 Today 属性,那么时间部分只是 00:00:00,它应该可以很好地用于使用 >= 和 的查询
    • 使用 dt.Today 时显示:Error Member 'System.DateTime.Today.get' cannot be access with an instance reference;而是用类型名称来限定它。我已将其更改为 dt.ToShortDateString();对吗?
    • 又是我的错。是 dt.Date,不应该使用字符串(ToShortDateString 生成字符串)来传递日期时间值
    • 那是我的错误。在 dt.Date 末尾使用了 ()。现在更正了。工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2014-05-03
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多