Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2008日期时间范围查询_Sql_Sql Server 2008 - Fatal编程技术网

SQL Server 2008日期时间范围查询

SQL Server 2008日期时间范围查询,sql,sql-server-2008,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 stev

我有一个名为
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
和一个查询:

select UserName 
from Users  
where CreateTime >= '2012-08-30' and CreateTime <= '2012-08-31' 
选择用户名
来自用户
其中CreateTime>='2012-08-30'和CreateTime试试这个

select  UserName 
from  Users  
where CreateTime>='2012-08-30' and CreateTime<'2012-09-01'
选择用户名
来自用户

其中CreateTime>='2012-08-30'和CreateTime的基本问题是,当您只需输入一个日期时,SQL Server将该日期解释为该日期的午夜。所以,当你问“2012-08-31”时,它的意思是“2012-08-31 12:00AM”

最好的解决办法是在你想要的一天之外多用一天,使用少于,而不是少于或等于

select  UserName from  Users  where CreateTime>='2012-08-30' and CreateTime < '2012-09-01'
从CreateTime>='2012-08-30'和CreateTime<'2012-09-01'的用户中选择用户名
CreateTime
从CreateTime>='2012-08-30'和CreateTime<'2012-09-01'的用户中选择用户名

它没有显示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'
选择用户名
来自用户
其中CreateTime>='2012-08-30'和CreateTime<'2012-09-01'
明确提及时间的示例

SELECT UserName 
FROM Users  
WHERE CreateTime >= '2012-08-30 00:00:00' AND CreateTime < '2012-09-31 23:59:59'
选择用户名
来自用户
其中CreateTime>='2012-08-30 00:00:00'和CreateTime<'2012-09-31 23:59:59'
您只需将
CreateTime
Datetime
更改为
Date
,如下所示:

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

您应该使用以下内容:

SELECT UserName 
 FROM Users 
WHERE DATEDIFF(d, '2012-08-30', CreateTime) >= 0 
  AND DATEDIFF(d, @ToDate, '2012-09-01') <=0
选择用户名
来自用户
其中DATEDIFF(d,'2012-08-30',CreateTime)>=0

DATEDIFF(d,@ToDate,'2012-09-01')您的CreateTime列是dateTime列吗?您还应该在WHERE子句中使用datetype(目前您使用的是字符串,主要是它不起作用的原因)。编辑:使用类似CAST('01-JAN-2009'作为日期时间)的内容不正确。字符串是ANSI SQL中日期/时间的完美表示形式。他的查询只错了三个字符,下面的解决方案有多个副本。第二个条件中的小于或等于将走得太远。它需要小于。哦,忘了删除那个符号。请正确格式化您的源代码,不要只复制其他人的答案。嗨,Thorsten Dittmar,我该怎么做?现在主要是删除答案。这里已经有多个正确解决方案的副本。将来,要正确格式化代码,请选择您在表单中键入的代码,然后单击看起来像两个大括号({})的按钮。这将缩进文本,告诉StackOverflow将其格式化为页面中的代码。由于
CreateTime
列是
DATETIME
列,我可能会使用
CAST(CreateTime as DATE)
来代替它-无需为转换指定字符串格式/样式….@marc\s您是对的。当列数据类型为
DATETIME
时,我们应该使用
CAST
而不是
CONVERT
。更新了答案。@hims056:如果像这样对数据库的CreateTime值使用强制转换,则会弄乱索引,因此查询将缓慢运行。在第二次查询中,应使用
SELECT UserName 
 FROM Users 
WHERE DATEDIFF(d, '2012-08-30', CreateTime) >= 0 
  AND DATEDIFF(d, @ToDate, '2012-09-01') <=0