比较数据库中的当前日期

时间:2014-11-07 17:54:09

标签: c# sql sql-server-2008-r2

我在数据库中有一个DateTime格式的字段。

我想查询以提取今天的所有行,但数据库中的该字段具有以下格式:2014-11-07 21:21:22.733,我不想查看小时数,秒和分钟,我需要检查一天。

我这样做了:

string query = @"SELECT *
                 FROM Orders
                 WHERE PrintTime is NULL
                   AND CONVERT(DATE, Datelogged) = @Datelogged
                 ";
command.Parameters.AddWithValue("@Datelogged", DateTime.Today);

但我一直没有结果。

2 个答案:

答案 0 :(得分:1)

您没有说明您的日期/时间列是什么数据类型"2014-11-07 21:21:22.733"只是列中数据的文本表示)。

假设您的DateLogged列定义为datetimedatetime2而不是varchar(32),您可以执行以下操作:

public DataTable Fetchorders( DateTime dt )
{
  DataTable dt = new DataTable() ;

  using ( SqlConnection conn = new SqlConnection( "..." ) )
  using ( SqlCommand    cmd  = conn.CreateCommand()       )
  using ( SqlDataAdapter sda = new SqlDataAdapter(cmd)    ) 
  {
    string query = @"
      SELECT o.*
      FROM Orders o
      WHERE o.DateLogged >= @date
        and o.DateLogged <  dateadd(day,1,@date)
      " ;

    cmd.CommandText = query ;
    cmd.CommandType = CommandType.Text ;
    cmd.Parameters.Add(
       new SqlParameter( "@date" , dt.Date , SqlDbType.DateTime )
       ) ;

    conn.Open() ;
    sda.Fill(dt) ;
    conn.Close() ;

  }

  return dt ;
}

您希望避免convert(date,t.DateLogged)之类的内容,因为它会将列转换为表达式,并使SQL Server优化程序无法使用任何覆盖索引。因此,不是寻找有问题的行,而是可以进行表扫描。

答案 1 :(得分:0)

试试这个:

使用 GETDATE()从SQL Server获取当前日期和时间。

string query = "SELECT * FROM Orders WHERE PrintTime is NULL AND CONVERT(DATE, Datelogged) = CONVERT(DATE,GETDATE())";