如何在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 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命令中,然后就完成了。