Sql server 如何按SQL语句中没有时间组件的日期范围进行筛选

Sql server 如何按SQL语句中没有时间组件的日期范围进行筛选,sql-server,Sql Server,示例查询 SELECT * FROM orders WHERE New_ActualDate >= @fromdate AND New_ActualDate <= @todate q.Parameters.AddWithValue("@fromdate", calFrom.SelectedDate); q.Parameters.AddWithValue("@todate", calTo.SelectedDate); 当我检查参数值时,它们是: @fromdate='01/08/2

示例查询

SELECT * FROM orders WHERE New_ActualDate >= @fromdate AND New_ActualDate <= @todate

q.Parameters.AddWithValue("@fromdate", calFrom.SelectedDate);
q.Parameters.AddWithValue("@todate", calTo.SelectedDate);
当我检查参数值时,它们是:

@fromdate='01/08/2016 00:00:00' @todate='2016年8月31日00:00:00'

我看到的问题是,从昨天到8月31日的所有订单都从报告中丢失了


在这个例子中,我还需要设置时间吗?

诀窍是使用明天的日期并更改给出的答案将起作用,这是处理组合日期/时间字段的好方法。然而,这可能值得你或其他读者了解另一种解决方案——为什么在你不需要的时候处理事情

SQLServer支持一种日期数据类型,它的作用与您期望的完全相同:它只存储日期,不存储时间戳。这有一些大小方面的好处,还可以帮助您避免编写混乱的查询来处理时间戳


如果新的_ActualDate列只是一个日期,那么它可以而且我认为应该使用date而不是datetime或datetime2。然后,您可以只将参数的日期部分传递给它,您的查询将如您最初所希望的那样工作。

我认为BETWEEN语法非常简洁。为了使用它,我们有一个扩展名为.EndOfDay

所以我可能会用以下方式来写:

任何语言都应该支持类似的东西

SQL语句

参数


如果列New_ActualDate包含时间,请将您的查询更改为和New_ActualDateSELECT * FROM orders WHERE New_ActualDate >= @fromdate AND New_ActualDate < @todatePlusOne q.Parameters.AddWithValue("@fromdate", calFrom.SelectedDate); q.Parameters.AddWithValue("@todatePlusOne", calTo.SelectedDate.AddDays(1));
public static DateTime EndOfDay(this DateTime dateTime)
        {
            return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0, dateTime.Kind).AddDays(1).AddMinutes(-1);
        }
SELECT * 
FROM orders 
WHERE New_ActualDate BETWEEN @fromdate AND @todate
q.Parameters.AddWithValue("@fromdate", calFrom.SelectedDate);
q.Parameters.AddWithValue("@todate", calTo.SelectedDate.EndOfDay());