列出指定區間的日期

我想只要有接觸資料庫

總有一天會遇到需要篩選出你會讓你目瞪口呆的需求

好比我就曾經被要求select出日曆來

我想只要有接觸資料庫

總有一天會遇到需要篩選出你會讓你目瞪口呆的需求

好比我就曾經被要求select出日曆來

有時我們乾脆先抓出資料丟到DataTable然後給他跑個幾次迴圈去處理

畢竟我們在剛開始寫程式時大多都沒有太多資料可以練習…

 

前陣子我朋友就問了一個問題

"要怎麼列出指定日期區間各日期"

例如

image

像這種問題其實解法跟寫日曆差不多

他第一步就是要產生假資料

怎麼產生假資料?

跑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')

image

這樣就產生這樣的結果來了

我想到這一動基本上答案已經出來了

就是再配合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就要找出答案

一步一步解反而可以很快就看見答案Smile

看到答案後也不要急,可以在重新看一下,搞不好又找出更精簡可讀的寫法

像我覺得sql這種語法其實解出來還蠻有成就感的,而且解答常常有很多

所謂一山還有一山高阿,可能哪天又遇到高人跟我說"你寫這什麼鳥東西,這樣不就一句搞定了"

這也是sql這種語法的樂趣之一^^