如何在SQL Select语句中仅比较日期(没有时间戳)

时间:2013-03-08 17:23:40

标签: c# .net sql sql-server

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

这就是我所拥有的:

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

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

6 个答案:

答案 0 :(得分:4)

如果您使用的是sql server 2008及更高版本,则可以执行以下操作:

select cast( getdate() as date)

答案 1 :(得分:2)

您使用的是什么数据库?

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

答案 2 :(得分:2)

一种稍微过时的方式是:

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,然后截断结束。

编辑: 使用getdate()

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

答案 3 :(得分:1)

如果您只关心日期部分并想要删除时间部分,请尝试使用TRUNC(Rec_Date)。类似的东西:

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

(这在Oracle工作......可能只是Oracle的事情......)

答案 4 :(得分:1)

以下内容适用于所有版本的SQL Server,无论Rec_Date的类型如何:

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上定义了索引,则可以使用它来检索请求的行。

答案 5 :(得分:1)

首先,您希望摆脱使用字符串连接构建动态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命令的paremter,然后就完成了。