SELECT语句按时间过滤

时间:2012-03-23 13:38:05

标签: sql-server-2008 tsql

表A,OrderId,OrderTimeStamp(datetime)列。

我想选择任何日期的所有记录,例如在上午10点到下午1点之间。

我该怎么做?

谢谢!

4 个答案:

答案 0 :(得分:19)

declare @t table(d datetime)

insert @t values('2012-01-01 09:00'),('2012-01-01 10:00'),('2012-01-01 11:00')

select cast(d as time) from @t where  cast(d as time) between '10:00' and '13:00'

答案 1 :(得分:4)

在T-SQL DatePart中可以解决问题:

10:00 - 12:59获取所有记录:

SELECT *
  FROM TableA
  WHERE DATEPART(hh, [OrderTimeStamp]) >= 10 AND DATEPART(hh, [OrderTimeStamp]) < 13

或者如果你想从10:00 - 13:00获取所有记录(省略秒/毫秒):

SELECT *
  FROM TableA
  WHERE DATEPART(hh, [OrderTimeStamp]) >= 10 AND DATEPART(hh, [OrderTimeStamp]) < 13
  OR (DATEPART(hh, [OrderTimeStamp]) = 13 AND DATEPART(mi, [OrderTimeStamp]) = 0)

请注意,与DatePart格式一起使用时,hh函数会返回24h值。

有关详细信息,请参阅此处:
http://msdn.microsoft.com/en-us/library/ms174420.aspx

更新

由于ouy正在使用SQL 2008,您可以使用TIME数据类型并使查询更简单(也更正确):

SELECT *
  FROM TableA
  WHERE CONVERT(TIME(7), [OrderTimeStamp ]) >= '10:00:00.0000000' 
  AND CONVERT(TIME(7), [OrderTimeStamp ]) <= '13:00:00.0000000'

有关详细信息,请参阅此处:
http://msdn.microsoft.com/en-us/library/bb677243.aspx

答案 2 :(得分:2)

select *
from TableA
where datepart(hh, OrderTimeStamp) >= 10 and datepart(hh, OrderTimeStamp) < 13

更新

是的,ntziolis击败了我30秒。有一点需要注意,如果你想要包括下午1点,一定要确定where&lt; =的最后一部分。如果你想只到12:59.999 pm&lt;是合适的。

答案 3 :(得分:2)

select * 
from tableA
where datepart(hh, OrderTimeStamp) between 10 and 13

如果您需要按分钟过滤(例如13:20和14:15),请尝试this链接上的建议