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

Posted

技术标签:

【中文标题】如何在 SQL Select 语句中仅比较日期(无时间戳)【英文标题】:How to compare the date only (without timestamp) in an SQL Select statement 【发布时间】:2013-03-08 17:23:39 【问题描述】:

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

这是我所拥有的:

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

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

【问题讨论】:

你使用的是什么版本的 SQL Server 附带说明,您能保证 tpid 始终是整数吗? (我假设是这样)Sql Injection 不好 使用 SQL Server 2005 版本。 【参考方案1】:

如果您使用的是 sql server 2008 及更高版本,您可以这样做:

select cast( getdate() as date)

【讨论】:

我会在“Rec_Date”字段上使用演员表功能吗?我应该在哪里插入我的字段? @Grant - 我收到错误消息:类型 DATE 不是已定义的系统类型。哇怎么了。 select @@version 的输出是什么? DATE 类型并非永远存在【参考方案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))";

【讨论】:

我试过了,得到一个错误消息:当前上下文中不存在名称'CONVERT' 您使用的是什么版本的 SQL? 我有一个简单的错字,现在试试吧。 仍然出现同样的错误。出于某种原因,它不喜欢等式右侧的 CONVERT 函数。 没注意到是vb函数,再试一次,为什么不直接使用getdate()?【参考方案3】:

你用的是什么数据库?

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

【讨论】:

看看这个链接,我想它有你要找的东西***.com/questions/1503298/…【参考方案4】:

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

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

(这在 Oracle 中有效......它可能只是 Oracle 的东西......)

【讨论】:

当我这样做时,我收到一条错误消息“TRUNC 不是可识别的内置函数名称”【参考方案5】:

无论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 上定义了一个索引,则它可以用于检索请求的行。

【讨论】:

【参考方案6】:

首先你想摆脱使用字符串连接构建动态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 命令中,您就完成了。

【讨论】:

以上是关于如何在 SQL Select 语句中仅比较日期(无时间戳)的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中日期时间类型怎么比较

Sql2000数据库中的药品过期日期和现在的时间相比较,将还有30天就过期的药品显示出来,SQL语句如何写?

在 FileNet 内容引擎中仅使用日期查询 DateTime 字段

如何在 SQL Select 语句中将文本字段更改为日期字段

如何在日期字段 SQL Server 中仅设置天数

sql 语句中如何比较当前时间与指定时间是不是相同