2014-02-17 612 views
1

在SQL Server中,搜索日期范围时是否必须指定时间戳?例如,这两个查询将返回相同的结果。SQL Server搜索日期范围

SELECT SalesOrderID, ShipDate 
FROM Sales.SalesOrderHeader 
WHERE ShipDate BETWEEN '2005-07-23T00:00:00' AND '2005-07-24T23:59:59'; 

SELECT SalesOrderID, ShipDate 
FROM Sales.SalesOrderHeader 
WHERE ShipDate BETWEEN '2005-07-23' AND '2005-07-24'; 

回答

3

BETWEEN是包容性的,并没有指定时默认时间为00:00:00。

因此,如果您排除时间部分,并且您的字段为DATETIME,您将在结束日期的时间00:00:00之后排除任何记录。如果您的字段是DATE,那么时间不是必需的。

您也可以只使用<和晚一天:

WHERE ShipDate >= '2005-07-23' 
    AND ShipDate < '2005-07-25' 
+0

如果我将记录更新为'2005-07-23 10:00:00.000',仍然可以获取该记录。 – user595234

+0

是的,但是如果它是'2005-07-24 10:00:00.000',它将被排除在'2005-07-24 00:00:00.000'之后。 –

0

尝试:

SELECT SalesOrderID, ShipDate 
FROM Sales.SalesOrderHeader 
WHERE cast(ShipDate as date) BETWEEN cast('20050723' as date) AND cast('20050724' as date); 

转换为日期类型时,你不需要写时,分... :)

+1

这种方法有一些问题。看到[铸造迄今是sargable,但它是一个好主意?](http://dba.stackexchange.com/q/34047/3690) –

+0

谢谢,真的.. – LuisR9