我的数据库是SQL Server 2008,我有一个查询,它返回按日期过滤的一些细节。在查询的WHERE结尾处,我有类似的东西
WHERE (CONVERT (DATE, Attendance.in_time) = @inDate)
注意:Attendance.in_time
是DateTime
列
我尝试仅从in_time
获取日期部分,并将其与.net中的@inDate
参数进行比较。
我的问题是,在.NET中,我们只能拥有DateTime的数据部分。一种选择是将其转换为字符串,如下所示
var inDate = InTime.Date.ToString("d");
但现在问题是在SQL查询中无法比较Date和String吗?
任何人都可以提供解决方案吗?
编辑:根据评论中的要求,我在此处显示完整查询...
public List<IAttendance> ShowAttendance(DateTime InDate, string pid, List<IAttendance> list)
{
string selectStatement = "SELECT Employee.Emp_ID, Employee.Initials + ' ' + Employee.Surname AS Name, Attendance.in_time, Attendance.out_time, Attendance.shift "+
"FROM Attendance INNER JOIN Employee ON Attendance.EID = Employee.Emp_ID "+
"WHERE (CONVERT (DATE, Attendance.in_time) = @inDate) AND (Attendance.PID = @pid) ";
//
}
答案 0 :(得分:1)
您可以更改SQL查询以利用BETWEEN子句
public List<IAttendance> ShowAttendance(DateTime InDate, string pid, List<IAttendance> list)
{
string selectStatement = "SELECT Employee.Emp_ID, Employee.Initials + ' '" +
"Employee.Surname AS Name, Attendance.in_time, " +
"Attendance.out_time, Attendance.shift " +
"FROM Attendance INNER JOIN Employee " +
"ON Attendance.EID = Employee.Emp_ID " +
"WHERE (Attendance.in_time BETWEEN @inDate AND @endDate) " +
"AND Attendance.PID = @pid";
......
}
并传递两个参数:
cmd.Parameters.AddWithValue("@inDate", InDate.Date);
cmd.Parameters.AddWithValue("@endDate", InDate.Date.AddMinutes(1439));
.....
这样,返回的记录就会出现在同一天,而不需要在SQL Server端进行复杂的转换。
正如下面的评论所指出的,如果在23.59之后存储了一些值,您可以使用AddSeconds(86399)
代替AddMinutes(1439)
来包含这些值。如果由于DateTime sql类型的性质而需要毫秒精度,那么
cmd.Parameters.AddWithValue("@endDate", InDate.Date.AddSeconds(86399).AddMilliseconds(999));
再次,由于下面的一些评论。可能最好的选择是使用
&#34; WHERE(Attendance.in_time&gt; = @inDate AND Attendance.in_time&lt; @endDate)&#34;
将参数定义为
cmd.Parameters.AddWithValue("@inDate", InDate.Date);
cmd.Parameters.AddWithValue("@endDate", InDate.Date.AddDay(1));
答案 1 :(得分:1)
简单解决方案:只需传递InDate.Today
作为参数,而不是更改SQL语法。
上午12:00的DateTime等于同一天的日期。
DECLARE @X DATETIME
DECLARE @Y DATE
SET @Y = '12/31/2010'
SET @X = '12/31/2010 12:00:00 am'
IF @X = @Y PRINT 'ok' -- prints ok
SET @X = '12/31/2010 12:00:01 am'
IF @X != @Y PRINT 'bad' -- prints bad
答案 2 :(得分:1)
我这样做比较
create function [dbo].[DateOnly](@DateTime DateTime)
-- Returns @DateTime at midnight; i.e., it removes the time portion of a DateTime value.
returns datetime
as
begin
return dateadd(dd,0, datediff(dd,0,@DateTime))
end
然后我用这种方式比较日期
WHERE dbo.dateonly(Attendance.in_time) = dbo.dateonly(@inDate)
答案 3 :(得分:0)
像这样定义inTime
:
var inDate = InTime.Date.ToString("dd-MM-yyyy");
答案 4 :(得分:0)
我会把它分解成YYYY MM DD
在SQL中它是
YEAR(Attendance.in_time)
MONTH(Attendance.in_time)
DAY(Attendance.in_time)
在.NET中它是属性
Year
Month
Day
所有6个都是Int