选择时间间隔中的值

时间:2012-11-21 06:44:58

标签: sql-server sql-server-2008 query-optimization

在我的应用程序中,我只想获得number of sales in a day by diiferent time interval

-----------------------------------------------------
Interval                     |  Count
-----------------------------------------------------
00:30 to 0:130               |  3
01:30 to 10:30               |  4
02:30 to 03:30               |  5
.. 
..
12:30 to 00:30               |  10
----------------------------------------------------- 

我尝试过像

这样的查询
select '00:30 to 01:30' as intrval , COUNT(*) AS 'count' from Pharmacy.tblSalesHdr  SH
where CAST(SH.created_Date AS TIME)  BETWEEN '00:30' AND '00:30'

UNION ALL

select '01:30 to 02:30' as intrval , COUNT(*) AS 'count' from Pharmacy.tblSalesHdr  SH
where CAST(SH.created_Date AS TIME)  BETWEEN '01:30' AND '02:30'

UNION ALL

select '02:30 to 03:30' as intrval , COUNT(*) AS 'count' from Pharmacy.tblSalesHdr  SH
where CAST(SH.created_Date AS TIME)  BETWEEN '02:30' AND '03:30'

and so on...

我只是想知道是否有better and optimized method来实现这一点。如果有人知道请分享。

1 个答案:

答案 0 :(得分:3)

您可以这样做:创建一个临时表,定义您想要的时间间隔,然后将其加入到Sales表中。您甚至可以为任务创建一个永久表。

  CREATE TABLE #Intervals (INTERVAL VARCHAR(20), FromTime TIME, ToTime TIME)
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('00:30 to 01:30', '00:30:00', '01:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('01:30 to 02:30', '01:30:00', '02:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('02:30 to 03:30', '02:30:00', '03:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('03:30 to 04:30', '03:30:00', '04:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('04:30 to 05:30', '04:30:00', '05:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('05:30 to 06:30', '05:30:00', '06:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('06:30 to 07:30', '06:30:00', '07:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('07:30 to 08:30', '07:30:00', '08:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('08:30 to 09:30', '08:30:00', '09:30:00')
  INSERT INTO #Intervals (INTERVAL, FromTime, ToTime) VALUES  ('09:30 to 10:30', '09:30:00', '10:30:00')
  -- etc...

  SELECT I.Interval, SUM(case when SH.created_Date IS NULL THEN 0 ELSE 1 END) 
  FROM #Intervals I
  LEFT JOIN Pharmacy.tblSalesHdr SH 
      ON CAST(SH.created_Date AS TIME) >= I.FromTime 
      AND CAST(SH.created_Date AS TIME) < I.ToTime
  GROUP BY I.Interval

  DROP TABLE #Intervals