sqlserver資料庫如何每時/每天/每月/每年任取一條資料

ever_idea發表於2016-08-30

    最近用sqlserver+.NET做一個專案,需求是要用圖表來顯示資料,而且是每時/每天/每月/每年任取一條資料,即如果使用者選擇時間的區域是同一天,那麼按區域的每小時取一條記錄,如果區間是一個月,那麼每天任取一條資料,如果區間是一年,每個月任取一條資料。。。。。

   開始根本毫無頭緒,甚至是想用很暴力的方式解決(多寫幾條sql語句),最後在別人提供的小demo裡面發現瞭解決方法。

   閒話不說,看sql語句:

   select * 

       from tempview a 

   where not exists(

       select 1 

             from tempview 

      where convert(varchar(13),receiveTime,120)=convert(varchar(13),a.receiveTime,120) and receiveTime>a.receiveTime

     );

   先解釋下convert函式:convert函式是用來格式化日期的方法(還有其他用處,自查)。第一個引數很明顯是最後返回的資料型別及型別長度(重要),第二個就是要格式化的物件,第三個就是要化成的格式值,如:這裡的120 代表的是:yyyy-mm-dd hh:mi:ss(24h)。

  具體的每個引數代表什麼含義,可以訪問w3c:       http://www.w3school.com.cn/sql/func_convert.asp

   為什麼第一個引數加了個重要呢,因為型別長度的變化,將是解決問題的核心。

    每月:  看一下要化成的格式:yyyy-mm-dd hh:mi:ss   當receiveTime只有年份相同時,我們就能夠通過比較月份是否相同來選取月份。這時將長度限制到yyyy(4)就能達到效果:所以SQL語句將變為這樣:

select * 

       from tempview a 

   where not exists(

       select 1 

             from tempview 

      where convert(varchar(4),receiveTime,120)=convert(varchar(4),a.receiveTime,120) and receiveTime>a.receiveTime

     );

 那麼同理可得:

  每月:yyyy-mm  varchar(7);

  每日:yyyy-mm-dd  varchar(10);

  每日:yyyy-mm-dd  hh   varchar(13);

   PS:注意應該要先把使用者選擇範圍內的資料先篩選出來,然後再基於這些資料選擇,所以上面的SQL語句用的是檢視。

   注意:上面的SQL語句不算隨機取,因為他始終取滿足條件的最後一條資料。

相關文章