2010-03-19 106 views
1

想象一下有两个字段的表,一个是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' 

然而,仅限制了最开始和结束时间。我可以用循环做到这一点,但我需要在相当大的日期范围内运行相同的查询,这将很快消耗服务器资源。有没有办法分别查询日期和时间?

回答

3
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功能以剥离的值的日期部分,然后与我们想要的值进行比较。

+0

你能解释一下之间的语法差异的where语句和这样的: WHERE(TimeOrdPlaced BETWEEN '2010-01-31' 和 '2010-02-27')和(DATEPART(HH,TimeOrdPlaced)6至22 ) 我的结果不同,比使用相同日期范围和时间的语法要高得多。 – Kylee 2010-03-23 19:33:33

+0

认为这是更容易扩大我的帖子来解释。 – Thomas 2010-03-23 21:49:31

+0

谢谢!这看起来像在工作。 – Kylee 2010-03-24 21:38:31

2

创建一个单独的计算列作为datepart(小时,日期列)* 60 + datepart(分钟,日期列),或者只有一小时不需要小分辨率。坚持计算列可以索引它,然后你就可以单独有效地寻找范围。在SQL 2008中有一些改进(新的TIME类型)。