SQL查某年某月有幾天的方法

  BOSS表示不論要查詢的月份&產線是否每天都有可動率及PPLH,都要列在圖表中,一開始的做法是在C#中不論查幾年幾月都塞31天,但若圖表在呈現時查詢的月份明明沒有31天(EX:2月只有28天)卻在圖表中列出來,即使表的row中是沒有值的但難免會令看的人感到突兀,主要方法及參考資料包含以下前輩的文章:

1.整體結構-利用數值序列產生當月日曆資料(SQL QnA-部落格
2.計算某初始日期加上一個數值後,傳回日期的方法(我的Coding之路-部落格)
3.日期格式轉換方法(資訊園-部落格)
4.T-SQL-master..spt_values應用(-Ma の 筆記本--部落格)

-------------------------我是分割線,以下可照搬到SQL中執行查詢--------------------------------------

SELECT number + 1 AS N --number是0開始所以要+1否則欄位N會從0開始

,CONVERT(VARCHAR(10), DATEADD(DD, number, CONVERT(CHAR(8), '2017-02-', 111) + '01'), 120) AS DT   --DATEADD函數以天為單位,number為指定數值,再指定起始日期'2017-02-01',最後再CONVERT一次日期格式

FROM master.dbo.spt_values

WHERE NAME IS NULL --不好解釋但實際去spt_values表看NAME IS NULL前後有什麼差就可以懂了

AND number < DAY(DATEADD(MM, 1, CONVERT(CHAR(8), '2017-02-', 111) + '01') - 1) -- <右邊是把月底算出來,用的是下個月初減1底即得本月底的概念

------------------------------------------------------------------------------------------------------------------------
--以下是另一個等效方法,上面做法是直接在第二行轉成我要的日期格式,這邊的做法則多了一個表去承接查詢結果,此時日期格式包含了時分秒,但我不需要精確到時分秒,因此再對此表中日期轉成我要的日期格式

--with inidateS  as (SELECT number +1 as  N   --number是0開始所以要+1否則欄位N會從0開始
--  , DATEADD(DD, number, CONVERT(CHAR(8), '2017-02-', 111)+'01') as DT --DATEADD函數以天為單位,number為指定數值,再指定起始日期'2017-02-01'
--FROM master.dbo.spt_values
--WHERE name IS NULL
--AND number<DAY(
--DATEADD(MM
--, 1
--, CONVERT(CHAR(8),'2017-02-', 111) +'01'
--)-1
--)
--)
--SELECT N,CONVERT(VARCHAR(10),DT,111)as finalDT from inidateS

留言

這個網誌中的熱門文章

C#換行、連接符號

C#常用的幾個特殊逸出Escape字元

SQL連線設定-SQL 連線字串中關於 Persist Security Info 參數的用途