我有一个SQL SELECT语句,用于根据当前日期从我的表中选择记录。我想要做的是比较没有时间戳的日期,因为时间不匹配。我只关心约会。
这就是我所拥有的:
string SQL = @"SELECT Trans_Set_Id FROM EDI10002 " +
@"WHERE (Tp_Id = '" + tpid + "' AND Rec_Date = '" + DateTime.Now.ToShortDateString() + @"')";
我遇到的问题是如何仅从“Rec_Date”字段中获取日期?
答案 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,然后就完成了。