Sql server 2008 如何按日期查询Datetime对象?

Sql server 2008 如何按日期查询Datetime对象?,sql-server-2008,Sql Server 2008,我想根据特定日期查询表,但问题是该字段的数据类型是datetime select * from Supplier where modified_Date='2011-05-07 12:52:16.830' 此查询正在返回结果 但是 没有结果您必须考虑时间成分,因为2011-05-07 2011-05-07 12:52:16.830 或者更改为范围类型查询 select * from Supplier where modified_Date >= '2011-05-07

我想根据特定日期查询表,但问题是该字段的数据类型是datetime

select  * from  Supplier  where modified_Date='2011-05-07 12:52:16.830' 
此查询正在返回结果

但是


没有结果

您必须考虑时间成分,因为
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有一个
DATE
数据类型。您可以将
DATETIME
转换为
DATE
并执行比较

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

参考资料:

将select查询中的列转换为日期将显示结果。

为了给gbn的答案提供一种替代语法,您还可以使用
之间:

SELECT * 
FROM Supplier
WHERE modified_Date BETWEEN '2011-05-07' AND '2011-05-07 23:59:59:999'
EDIT:您必须将结束时间指定为
BETWEEN
默认值为午夜,在这种情况下,这将返回额外的行

发件人:

如果 测试_表达式大于或 等于begin_表达式的值 小于或等于 结束你的表达


从性能角度来看,SQL Server 2008将第二个版本转换为与第一个版本类似的版本。@Martin:是吗?现在无法测试。考虑到这一点,虽然是的,但它为计划添加了一个计算标量,给出了范围的两端。请参见
BETWEEN
将返回错误的结果。它将包括
'2011-05-08 00:00:00
道歉,你是对的,
之间的
将包括8日午夜。编辑了我的答案以反映这一点,这确实让查询变得难看:)您的答案仍然不起作用,因为
'2011-05-07 23:59:59:999'
四舍五入为
'2011-05-08 00:00:00:000'
<对于这种类型的查询,最好避免使用code>Between
。因为Nighil使用的是SQL Server 2008,所以我希望使用
DATETIME2
(根据MS的建议)。若要与DATETIME一起使用,请将最后的9更改为7。但是这会变得很混乱,所以,正如您所说,在这种情况下,最好避免在
之间使用
。我本来打算删除我的答案,但我想我会留下它,以帮助其他人避免落入与我相同的陷阱:)@Tony-OP在问题
datetime
中陈述。即使是在
datetime2(x)
上,使用的最正确的东西也取决于
x
的值。对于
datetime2(7)
您需要7位小数。
SELECT *
FROM   Supplier
WHERE  CAST(Modified_Date AS DATE) = '2011-05-07'
SELECT * 
FROM Supplier
WHERE modified_Date BETWEEN '2011-05-07' AND '2011-05-07 23:59:59:999'