2011-05-23 52 views
4

我想根据特定日期查询表,但问题是该字段的数据类型为datetime如何通过日期查询Datetime对象?

select * from Supplier where modified_Date='2011-05-07 12:52:16.830' 

该查询返回结果

select * from Supplier where modified_Date='2011-05-07' 

有没有结果

回答

5

SQL Server 2008的数据类型为DATE。您可以将您的DATETIME投射到DATE并进行比较。

SELECT * 
FROM Supplier 
WHERE CAST(Modified_Date AS DATE) = '2011-05-07' 

参考:DateTime TransactSQL

3

您必须考虑时间因素,因为2011-05-07 <> 2011-05-07 12:52:16.830

切换到一个范围类型的查询

select * from Supplier where 
    modified_Date >= '2011-05-07' 
    and 
    modified_Date < '2011-05-08' 

...或者因为你使用SQL Server 2008

select * from Supplier where 
    CAST(modified_Date AS date) = '2011-05-07' 

从性能的角度转换为日期,使用第一个。或者有一个索引计算列,可为您执行CAST并在此过滤此数据类型SQL Server 2008的数据类型为

+0

从性能角度来看,SQL Server 2008会将第二个转换成类似第一个的东西。 – 2011-05-23 10:11:52

+0

@Martin:是吗?目前无法测试。想到这个虽然https://connect.microsoft.com/SQLServer/feedback/details/653206/the-optimizer-should-be-able-to-understand-the-invertability-of-built-in-intrinsics-on- date-for-the-index-index-sargability – gbn 2011-05-23 10:17:32

+0

是的,它为计划添加了一个计算标量,该范围的两端都要查找。请参阅http://connect.microsoft.com/SQLServer/feedback/details/526431/make-more-functions-sargable – 2011-05-23 10:19:05

0

转换列到日期的选择查询将带来的结果。

0

刚刚发布的替代语法GBN的回答,您还可以使用BETWEEN

SELECT * 
FROM Supplier 
WHERE modified_Date BETWEEN '2011-05-07' AND '2011-05-07 23:59:59:999' 

编辑:你必须指定的结束时间为BETWEEN默认为午夜这将在此返回附加行案件。

BOL

返回TRUE之间。如果 与test_expression的值大于或 等于与begin_expression 的值且小于或等于 end_expression的值,。

+0

“BETWEEN”将返回错误的结果。它包括''2011-05-08 00:00:00' – 2011-05-23 11:59:25

+0

这是错误的,它不会工作 – Nighil 2011-05-23 12:05:05

+0

道歉,你是正确的,'BETWEEN'将包括8日午夜。已编辑我的答案,以反映这一点,它确实使查询丑陋:) – Tony 2011-05-23 13:36:38