如何在SQL Select语句中只比较日期(而不比较时间戳)

本文关键字:比较 日期 时间戳 SQL Select 语句 | 更新日期: 2023-09-27 18:02:54

我有一个SQL SELECT语句,根据当前日期从表中选择记录。我要做的是比较没有时间戳的日期,因为时间不匹配。我只在乎日期。

我有:

string SQL = @"SELECT Trans_Set_Id FROM EDI10002 " +
             @"WHERE (Tp_Id = '" + tpid + "' AND Rec_Date = '" + DateTime.Now.ToShortDateString() + @"')";  

我遇到的问题是如何从字段"Rec_Date"中获取日期?

如何在SQL Select语句中只比较日期(而不比较时间戳)

如果你使用的是sql server 2008及以上版本,你可以这样做:

select cast( getdate() as date)

一种稍显老式的方法是:

string SQL = "SELECT Trans_Set_Id FROM EDI10002 WHERE (Tp_Id = '" + tpid + "' AND CONVERT(varchar(10),Rec_Date, 101) = CONVERT(varchar(10), " + DateTime.Now.ToShortDateString() + ", 101))";

你基本上是转换成MM/dd/YYYY,然后截断结束。

编辑:获取当前日期()

string SQL = "SELECT Trans_Set_Id FROM EDI10002 WHERE (Tp_Id = '" + tpid + "' AND CONVERT(varchar(10),Rec_Date, 101) = CONVERT(varchar(10), getdate(), 101))";

您使用的是什么数据库?

看一下mssql的DATEPART函数http://msdn.microsoft.com/en-us/library/ms174420.aspx

如果您只关心日期部分而想要删除时间部分,请尝试使用TRUNC(Rec_Date)。比如:

... "' AND TRUNC(Rec_Date) = '" + DateTime.Today...

(这在Oracle中工作…

无论Rec_Date的类型如何,下面的操作应该在所有版本的SQL Server中工作:

SELECT Trans_Set_Id 
FROM EDI10002 
WHERE Tp_Id = @tpid 
      AND (Rec_Date >= DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)
           AND Rec_Date < DATEADD(day, DATEDIFF(day, 0, GETDATE()), 1))

使用DATEADD(day, DATEDIFF(...), ...)获取特定日期的开始。这意味着,如果您在Rec_Date上定义了索引,则可以使用它来检索所请求的行。

首先,您希望摆脱使用字符串连接构建动态sql语句的习惯,您希望使用参数化查询。

其次,在您的示例中,您不需要提供来自客户端的日期,它可以在sql中完成。

string SQL = @"SELECT Trans_Set_Id FROM EDI10002 " +
   @"WHERE (Tp_Id = @tpid" + 
   @" AND convert(varchar(10, Rec_Date, 121) = CONVERT(varchar(10), getdate(), 121) )";

或者如果你使用2008

string SQL = @"SELECT Trans_Set_Id FROM EDI10002 " +
   @"WHERE (Tp_Id = @tpid" + 
   @" AND cast(Rec_Date as date) = cast(getdate() as date) )";

将@tpid作为参数添加到sql命令中,然后就完成了。