在SQL Server中分别查询smalldatetime的日期和时间?
想象一下有两个字段的表,一个是smalltimedate和一个int,另一个是大约1000行数据。我在查询中所要做的是在2010年3月3日至2010年3月13日之间查找行的INT字段的平均值,并且仅当该条目在上午6点至晚上11点之间。在SQL Server中分别查询smalldatetime的日期和时间?
我试图
between '2010-03-03 06:00 AND 2010-03-13 23:00'
然而,仅限制了最开始和结束时间。我可以用循环做到这一点,但我需要在相当大的日期范围内运行相同的查询,这将很快消耗服务器资源。有没有办法分别查询日期和时间?
Select ...
From Table
Where DateCol >= '20100303'
And DateCol < '20100314'
And DatePart(hh,DateCol) Between 18 And 23
请注意,我使用严格小于20100314的比较,所以它会在2010年3月14日午夜之前返回任何内容。
编辑意识到你说的是PM而不是AM。
ADDITION在SQL中,语句“Foo Between DateA和DateB”被翻译为“Foo> = DateA和Foo < = DateB”。注意到该声明的第二部分小于或等于到DateB。在我们的查询中,我们希望在2010年3月13日到午夜之间包含所有内容。我通过将搜索范围限制在以下,我想要搜索的那一天严格小于。
对于小时,DatePart(hh,DateVal)将使用24小时制返回当天的小时。所以下午6点真的是18点。如果我们希望在下午6点到晚上11点之间,我们确实希望在18:00到23:00之间。
ADDITION在我的原始解决方案中出现了一个小问题。系统将返回时间在11点钟时间内的任何值(例如11:01 PM,11:30 PM,11:50 PM等)。下面是将解决该另一种解决方案:
Select ...
From Table
Where DateCol >= '20100303'
And DateCol < '20100314'
And DateAdd(day, -DateDiff(Day, 0, [DateCol]), [DateCol]) Between '18:00' And '23:00'
基本上,我使用的则DateDiff和使用DateAdd功能以剥离的值的日期部分,然后与我们想要的值进行比较。
创建一个单独的计算列作为datepart(小时,日期列)* 60 + datepart(分钟,日期列),或者只有一小时不需要小分辨率。坚持计算列可以索引它,然后你就可以单独有效地寻找范围。在SQL 2008中有一些改进(新的TIME类型)。
你能解释一下之间的语法差异的where语句和这样的: WHERE(TimeOrdPlaced BETWEEN '2010-01-31' 和 '2010-02-27')和(DATEPART(HH,TimeOrdPlaced)6至22 ) 我的结果不同,比使用相同日期范围和时间的语法要高得多。 – Kylee 2010-03-23 19:33:33
认为这是更容易扩大我的帖子来解释。 – Thomas 2010-03-23 21:49:31
谢谢!这看起来像在工作。 – Kylee 2010-03-24 21:38:31