2017-09-18 20 views
-3

我有一個DateTime類型的colomn,其中包含每個月的第一個日期。我想找出哪些月份是不是在colomn任何建議.. ??在SQL Server中按順序排列的日期列表中找出丟失的月份

實施例:

Dates_Of_Each_Months 
---------------------- 
01/01/2017 
02/01/2017 
04/01/2017 
06/01/2017 
05/01/2016 
07/01/2016 
09/01/2016 
10/01/2016 

期望輸出

Missing_Months 
-------------- 
03/01/2017 
05/01/2017 
06/01/2016 
08/01/2016 
+0

編輯您的問題,並提供採樣數據和期望的結果。 –

+0

從哪個日期開始 – Amit

回答

1
-- Creating a table to insert your data. 
-- You can use your database table here. 

DECLARE @tbl TABLE(
DateVal DATETIME 
) 

INSERT INTO @tbl SELECT CAST('01/01/2017' AS DATETIME) 
INSERT INTO @tbl SELECT CAST('02/01/2017' AS DATETIME) 
INSERT INTO @tbl SELECT CAST('04/01/2017' AS DATETIME) 
INSERT INTO @tbl SELECT CAST('06/01/2017' AS DATETIME) 
INSERT INTO @tbl SELECT CAST('05/01/2016' AS DATETIME) 
INSERT INTO @tbl SELECT CAST('07/01/2016' AS DATETIME) 
INSERT INTO @tbl SELECT CAST('09/01/2016' AS DATETIME) 
INSERT INTO @tbl SELECT CAST('10/01/2016' AS DATETIME) 


-- Creating another table variable that will contain the range 


DECLARE @tblRange TABLE(
DateValue DATETIME 
) 
DECLARE @startDate DATETIME = '' 
DECLARE @endDate DATETIME = '' 

-- Get the min date and max date from your range. 
;WITH DATES(MINDATE,MAXDATE) AS (
    SELECT (SELECT MIN(DateVal) FROM @tbl) A, 
    (SELECT MAX(DateVal) FROM @tbl) B 
) 
SELECT @startDate = MINDATE, @endDate = MAXDATE FROM DATES; 


--Populating the range 
--Get the difference between min and max in months 
DECLARE @seqDays INT; 
SELECT @seqDays = DATEDIFF(m, @startDate,@endDate) 

DECLARE @val INT = 1 
WHILE(@val <= @seqDays) 
BEGIN 
--Generate the range with the month 
INSERT INTO @tblRange VALUES(DATEADD(MONTH, @val, @startDate)) 
SET @val = @val + 1 
END 

--Get the months not present in original data 
SELECT DateValue FROM @tblRange WHERE DateValue NOT IN (SELECT DateVal FROM @tbl) 
0
CREATE TABLE #TAB (A_DATE DATETIME) 

INSERT INTO #TAB 
SELECT '2017-02-18 17:46:00' 
UNION ALL 
SELECT '2017-05-18 17:46:00' 
UNION ALL 
SELECT '2017-04-18 17:46:00' 
UNION ALL 
SELECT '2017-09-18 17:46:00' 
UNION ALL 
SELECT '2017-09-18 17:46:00' 

CREATE TABLE #TAB1 (G_DATE varchar(255)) 

INSERT INTO #TAB1 
SELECT 'January' 
UNION ALL 
SELECT 'February' 
UNION ALL 
SELECT 'March' 
UNION ALL 
SELECT 'April' 
UNION ALL 
SELECT 'May' 
UNION ALL 
SELECT 'June' 
UNION ALL 
SELECT 'July' 
UNION ALL 
SELECT 'August' 
UNION ALL 
SELECT 'September' 
UNION ALL 
SELECT 'October' 
UNION ALL 
SELECT 'November' 
UNION ALL 
SELECT 'December' 

SELECT * FROM #TAB1 
EXCEPT 
SELECT DATENAME(month, A_DATE) FROM #TAB 

DROP TABLE #TAB1,#TAB 

嘗試上述查詢它可能有助於

相關問題