8

我有一张桌子叫Users:</p>

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

和一个查询:

select UserName 
from Users  
where CreateTime >= '2012-08-30' and CreateTime <= '2012-08-31' 

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

如何解决这个问题?

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

4

7 回答 7

18

它没有显示 6 行,因为2012-08-31解释器将其接收为2012-08-31 00:00:00 AM. 由于您希望查看截至 31 日(包括 31 日)的数据,您可以明确提及时间或查询第二天的日期。

使用次日日期的示例

SELECT UserName 
FROM Users  
WHERE CreateTime >= '2012-08-30' AND CreateTime < '2012-09-01'

明确提及时间的示例

SELECT UserName 
FROM Users  
WHERE CreateTime >= '2012-08-30 00:00:00' AND CreateTime < '2012-09-31 23:59:59'
于 2012-08-31T07:09:44.630 回答
15

你所需要的只是CAST你的CreateTimefrom DatetimetoDate像这样:

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

你也可以像这样使用BETWEEN而不是:<=>=

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

看到这个 SQLFiddle

于 2012-08-31T07:22:39.890 回答
2

基本问题是,当您简单地输入一个日期时,SQL Server 将该日期解释为该日期的午夜。因此,当您询问“2012-08-31”时,它的真正含义是“2012-08-31 12:00AM”。

最好的解决方案是比你想要的那一天多走一天,使用少于,而不是少于或等于。

select  UserName from  Users  where CreateTime>='2012-08-30' and CreateTime < '2012-09-01'
于 2012-08-31T07:04:48.033 回答
0

试试这个

select  UserName 
from  Users  
where CreateTime>='2012-08-30' and CreateTime<'2012-09-01'
于 2012-08-31T07:04:40.843 回答
0

CreateTime<='2012-08-31'最后三个日期永远不会正确,因为它们的时间戳是在午夜之后。2012-08-31是 的缩写2012-08-31 00:00:00,因此只返回前三行。

您应该始终包含时间戳 - 另外:BETWEEN按照其他答案中的建议使用是个好主意。

于 2012-08-31T07:06:33.200 回答
0
select  UserName from  Users  where CreateTime>='2012-08-30' and CreateTime < '2012-09-01'
于 2012-08-31T07:08:27.393 回答
0

您应该使用以下内容:

SELECT UserName 
 FROM Users 
WHERE DATEDIFF(d, '2012-08-30', CreateTime) >= 0 
  AND DATEDIFF(d, @ToDate, '2012-09-01') <=0

您不需要通过此查询传递小时和分钟。

于 2017-03-24T10:50:01.570 回答