Sql server 2008 如何按日期查询Datetime对象?
我想根据特定日期查询表,但问题是该字段的数据类型是datetimeSql 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
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'