如何按日期过滤DateTime列

时间:2014-06-27 12:20:45

标签: c# sql .net sql-server datetime

我的数据库是SQL Server 2008,我有一个查询,它返回按日期过滤的一些细节。在查询的WHERE结尾处,我有类似的东西

WHERE (CONVERT (DATE, Attendance.in_time) = @inDate)

注意Attendance.in_timeDateTime

我尝试仅从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) ";

//

}

5 个答案:

答案 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

DateTime Properties

所有6个都是Int