3

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

这是我所拥有的:

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

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

4

6 回答 6

4

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

select cast( getdate() as date)
于 2013-03-08T17:26:46.997 回答
2

你用的是什么数据库?

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

于 2013-03-08T17:27:34.283 回答
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))";
于 2013-03-08T17:31:28.477 回答
1

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

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

(这在甲骨文工作......它可能只是甲骨文的事情......)

于 2013-03-08T17:24:49.047 回答
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,它可以用于检索请求的行。

于 2013-03-08T18:35:56.663 回答
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 命令中,您就完成了。

于 2013-03-09T03:29:16.850 回答