2017-05-09 77 views
1

今天隨機一個念頭來,使該獲得當月的所有細節到一個表中的一個動態查詢,假設如果當前本月是五月2017年,那麼輸出表應該是這樣的:在sql中獲取當前月份詳細信息。例如,月份有多少個星期?,平時有那個名字的伯爵?

Details   | Count 
-----------------|------------ 
First Date  | 05-01-2017 
Last Date  | 05-31-2017 
Count of Mon  | 5 
Count of Tues | 5 
Count of Wed  | 5 
Count of Thur | 4 
Count of Fri  | 4 
Count of Sat  | 4 
Count of Sun  | 4 
+0

那你試試這麼遠嗎?請製作[mcve],例如通過在sqlite'.dump'中表示您的數據來爲讀者提供一種環境或與之相適應。順便說一下,我對SQLite有一些想法,如果你給它加上標籤並提供mcve,我想我可以編輯你的嘗試來解決這個問題。 – Yunnosch

回答

1

通過結合下一鏈接: -

How can I select the first day of a month in SQL?

SQL Query to find the last day of the month

Count how many Sundays, Mondays, Tuesdays... in current month using MS SQL

試試下面的代碼: -

declare @T table(Details varchar(100) , Result varchar(100)); 

WITH CTE AS 
(
    SELECT DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE())[FIRST SUNDAY DATE],DATENAME(DW,DATEADD(D,-DATEPART(D,GETDATE())+1,GETDATE()))[DAY NAME] 
    UNION ALL 
    SELECT DATEADD(D,1,[FIRST SUNDAY DATE]),DATENAME(DW,DATEADD(D,1,[FIRST SUNDAY DATE]))FROM CTE WHERE [FIRST SUNDAY DATE]<=DATEADD(D,-DATEPART(D,GETDATE()),DATEADD(M,1,GETDATE()))-1 
) 
insert into @T(Details , Result) 
SELECT [DAY NAME],COUNT([DAY NAME]) as 'COUNT' FROM CTE GROUP BY [DAY NAME] 

Update @T 
set Details = 'Count OF ' + Details 

SELECT 'First Date' 'Details', convert(varchar(100),DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0),101) 'Count' 
Union all 
select 'Last Date' , convert(varchar(100),dateadd(month,1+datediff(month,0,GETDATE()),-1),101) 
union all 
select * from @T 

結果: -

enter image description here

+0

驚人的艾哈邁德,我在哪裏想要獲得月的第一天,然後增加7天,但你做日曆的方式,這是非常棒的。感謝你和stackoverflow讓平臺見到這麼精彩的大腦。 – Jayank

+0

嗨艾哈邁德,你能幫助我多一個問題https://stackoverflow.com/questions/44188006/manupilating-previous-month-data-according-to-current-month – Jayank

0
IF OBJECT_ID('Tempdb..#MonthDetails') IS NOT NULL 
Drop Table #MonthDetails 

Declare @monthdate DATE ='05-5-2017'--Provide date 
SET @monthdate =CONVERT(VARCHAR(10), @monthdate, 105) 

DECLARE @y INT = DATEPART(YEAR,@monthdate), 
     @EndOFMonth Varchar(10), 
     @StartOfMonth Varchar(10) 

CREATE TABLE #MonthDetails(ID Int IDENTITY,[MonthName] Varchar(10),EndOFMonth Varchar(10),StartOfMonth Varchar(10) 
,[Mon] INT,[Tue] INT,[Wed] INT,[Thu] INT, [Fri] INT,[Sat] INT,[Sun] INT,[Sum] INT) 


SET @EndOFMonth= CONVERT(VARCHAR(10),EOMONTH(@monthdate),105) 
SET @StartOfMonth=CONVERT(VARCHAR(10),DATEADD(month, DATEDIFF(month, 0, @monthdate), 0),105) 

DECLARE @d DATETIME = dateadd(year, @y - 1900, 0) 
;WITH CTE 
AS 
(
    SELECT 1 A, 
     LEFT(DATENAME(WEEKDAY, @D), 3) B, 
     DATENAME(MONTH, 0) MONTH, 
     1 SORT 
    UNION ALL 
    SELECT A + 1 A, 
     LEFT(DATENAME(WEEKDAY, @D + A), 3) B, 
     DATENAME(MONTH, @D + A) MONTH, 
     DATEPART(MONTH, @D + A) SORT 
    FROM CTE WHERE A < DATEPART(DAYOFYEAR, DATEADD(YEAR, 1, @D)-1) 
) 
INSERT INTO #MonthDetails([MonthName],EndOFMonth,StartOfMonth,[Mon],[Tue],[Wed],[Thu],[Fri],[Sat],[Sun],[Sum]) 
SELECT [MONTH], 
     @EndOFMonth, 
    @StartOfMonth, 

    [Mon],[Tue],[Wed],[Thu],[Fri],[Sat],[Sun], 
    [Mon]+[Tue]+[Wed]+[Thu]+[Fri]+[Sat]+[Sun] [Sum] 
FROM cte 
PIVOT (COUNT(a) FOR [b] IN ([Mon],[Tue],[Wed],[Thu],[Fri],[Sat],[Sun],[Sum])) AS pvt WHERE [MONTH]=DATENAME(MM,@monthdate) 
ORDER BY sort 
OPTION (MAXRECURSION 366) 

;With Result 
AS 
(

SELECT ISNULL(NULL,'FirstDate') AS Details ,StartOfMonth AS [Count]     FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'LastDate') ,EndOFMonth           FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'Count of Mon') , CAST([Mon] AS VARCHAR(5))      FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'Count of Tues') , CAST([Tue] AS VARCHAR(5))      FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'Count of Wed') , CAST([Wed] AS VARCHAR(5))      FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'Count of Thur') , CAST([Thu] AS VARCHAR(5))      FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'Count of Fri') , CAST([Fri] AS VARCHAR(5))      FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'Count of Sat') , CAST([Sat] AS VARCHAR(5))      FROM #MonthDetails UNION ALL 
SELECT ISNULL(NULL,'Count of Sun') , CAST([Sun] AS VARCHAR(5))      FROM #MonthDetails UNION ALL     
SELECT ISNULL(NULL,'Total Days Of Month'),CAST([Sum] AS VARCHAR(5))    FROM #MonthDetails 
) 
SELECT * from Result 

輸出

Details     |Count 
-------------------------------------  
FirstDate    |01-01-2017 
LastDate    |31-01-2017 
Count of Mon   |5 
Count of Tues   |5 
Count of Wed   |4 
Count of Thur   |4 
Count of Fri   |4 
Count of Sat   |4 
Count of Sun   |5 
Total Days Of Month  |31 
相關問題