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