如何在 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 语句中仅比较日期(无时间戳)的主要内容,如果未能解决你的问题,请参考以下文章
Sql2000数据库中的药品过期日期和现在的时间相比较,将还有30天就过期的药品显示出来,SQL语句如何写?
在 FileNet 内容引擎中仅使用日期查询 DateTime 字段