我想只要有接觸資料庫
總有一天會遇到需要篩選出你會讓你目瞪口呆的需求
好比我就曾經被要求select出日曆來
我想只要有接觸資料庫
總有一天會遇到需要篩選出你會讓你目瞪口呆的需求
好比我就曾經被要求select出日曆來
有時我們乾脆先抓出資料丟到DataTable然後給他跑個幾次迴圈去處理
畢竟我們在剛開始寫程式時大多都沒有太多資料可以練習…
前陣子我朋友就問了一個問題
"要怎麼列出指定日期區間各日期"
例如
像這種問題其實解法跟寫日曆差不多
他第一步就是要產生假資料
怎麼產生假資料?
跑Cursor嗎?
當然不是,太累了!
找一個已經存在的table去select就好
像這個問題第一步就是先做出要求的日期區間內的所有資料
例如要列出來的是2010/04/14~2010/06/22就得產生這區間內69天的假資料
所以我就拿sysobjects來select就好了
select * from (
select
id,row_number()over(order by id) rows
from
sysobjects
)Tmp
where
Tmp.rows <= datediff(d,'2010/04/14', '2010/06/22')
這樣就產生這樣的結果來了
我想到這一動基本上答案已經出來了
就是再配合dateadd就OK了
select dateadd(d,rows-1,'2010/04/14') mydate from (
select
id,row_number()over(order by id) rows
from
sysobjects
)Tmp
where
Tmp.rows <= datediff(d,'2010/04/14', '2010/06/22') + 1
很多時候其實要組的資料只要拆段來解,不一定急著一次select就要找出答案
一步一步解反而可以很快就看見答案
看到答案後也不要急,可以在重新看一下,搞不好又找出更精簡可讀的寫法
像我覺得sql這種語法其實解出來還蠻有成就感的,而且解答常常有很多
所謂一山還有一山高阿,可能哪天又遇到高人跟我說"你寫這什麼鳥東西,這樣不就一句搞定了"
這也是sql這種語法的樂趣之一^^