SQL Server 2008 DateTime范围查询

use*_*222 6 sql sql-server-2008

我有一张名为Users:

CreateTime                     UserName
========================================
2012-08-30 14:23:12:000           zhang
2012-08-30 15:11:13:000           li
2012-08-30 16:32:22:000           wang
2012-08-31 11:23:12:000           steven
2012-08-31 12:05:14:000           zhao
2012-08-31 08:23:12:000           ddd
Run Code Online (Sandbox Code Playgroud)

和查询:

select UserName 
from Users  
where CreateTime >= '2012-08-30' and CreateTime <= '2012-08-31' 
Run Code Online (Sandbox Code Playgroud)

因此,结果应该是6行,但事实并非如此.

怎么解决这个?

使用SQL Server Convert功能CONVERT(VARCHAR(23), CreateTime, 121)

小智 16

它没有显示6行,因为2012-08-31解释器收到了这些行2012-08-31 00:00:00 AM.由于您希望查看包含31日的数据,因此您可以明确提及时间或查询第二天的日期.

示例使用下一天的日期

SELECT UserName 
FROM Users  
WHERE CreateTime >= '2012-08-30' AND CreateTime < '2012-09-01'
Run Code Online (Sandbox Code Playgroud)

明确提及时间的例子

SELECT UserName 
FROM Users  
WHERE CreateTime >= '2012-08-30 00:00:00' AND CreateTime < '2012-09-31 23:59:59'
Run Code Online (Sandbox Code Playgroud)


him*_*056 13

所有你需要的是CASTCreateTimeDatetimeDate这样的:

SELECT  UserName FROM Users 
WHERE CAST(CreateTime as date)>='2012-08-30' 
AND CAST(CreateTime as date)<= '2012-08-31';
Run Code Online (Sandbox Code Playgroud)

您还可以使用BETWEEN的,而不是<=>=这样的:

SELECT  UserName FROM Users 
WHERE CAST(CreateTime as date) BETWEEN 
'2012-08-30' AND '2012-08-31';
Run Code Online (Sandbox Code Playgroud)

看到这个SQLFiddle

  • 由于`CreateTime`列是一个`DATETIME`列,我可能会使用`CAST(CreateTime AS DATE)` - 不需要为转换指定字符串格式/样式.... (2认同)
  • @hims056:如果您对数据库的 CreateTime 值使用 CAST,它会扰乱索引,因此您的查询将运行缓慢。 (2认同)