2015年9月23日 星期三

產生指定範圍內一定時間間隔的時間表

有個查詢系統的需求需要一個可以查詢固定一個時間範圍內,
某間隔時間的統計資料結果(例如每10分鐘或每小時),
如果只是單純對資料時間做分段進行統計那倒是很容易,
用DatePart以及DateAdd函式配合指定的時間間隔就可以輕鬆搞定。

不過,麻煩點在需求上原始資料時間中沒有的時間段一樣需要顯示,並且標示其值為0,
所以只單純針對原始資料進行時間分段似乎不夠,
第一個想法就是將該原始資料最小與最大時間段的時間依指定的間隔,
建立一個時間表,然後跟原始資料做JOIN,
這樣原始資料沒有紀錄的時間段自然就可以補0,

問題來了,這時間表要怎建.....
先跑個loop然後把查詢時間範圍內的時間依間隔作時間分割建成表,
雖然這樣好像可以,但總覺得有點搞工,應該有更好的解決方式....
向google大神討教一番後,
看到有人透過系統資料表spt_values方式去建立相關需要連續常數的資料,
一開始就覺得此方法可行,並測試了一下確定可以,不過後來看到了這系列文章
Generate a set or sequence without loops
以及這篇文章
Why should I consider using an auxiliary numbers table?
最後決定放棄使用spt_values, 採用直接建立一個Number table再進一步產生時間表,
Number table建立方式其實就只是一個表內存著N長度的連續整數,EX:
SELECT TOP 10 [Number] FROM [dbo].[Numbers]

Number
-----------
0
1
2
3
4
5
6
7
8
9

(10 個資料列受到影響)
然後透過這個Number Table就能產生出指定時間範圍內一定時間間隔的時間表了,
EX:2015-09-23 18:00:00~21:00:00 每10分鐘一個間距
select convert(varchar(16),dateadd(minute,number*10,'2015-09-23 18:00:00'),120) as [m_time] 
from [dbo].[Numbers] 
where convert(varchar(16),dateadd(minute,number*10,'2015-09-23 18:00:00'),120)< '2015-09-23 21:00:00'

m_time
----------------
2015-09-23 18:00
2015-09-23 18:10
2015-09-23 18:20
2015-09-23 18:30
2015-09-23 18:40
2015-09-23 18:50
2015-09-23 19:00
2015-09-23 19:10
2015-09-23 19:20
2015-09-23 19:30
2015-09-23 19:40
2015-09-23 19:50
2015-09-23 20:00
2015-09-23 20:10
2015-09-23 20:20
2015-09-23 20:30
2015-09-23 20:40
2015-09-23 20:50
2015-09-23 21:00

(19 個資料列受到影響)

沒有留言:

張貼留言

Android Audio 心得筆記(一):Audio Stream類型與預設音量

因為一些工作關係所以接觸到Android上層Audio Framework與Volume相關的部分, 記錄一下這一段時間追Code的心得,這邊會以Google N的Code為參考. Android Audio總共定義10種STREAM類型(不含DEFAULT), 用途都蠻...