查找SQL Server中按顺序排列的日期列表中缺少的月份

查找SQL Server中按顺序排列的日期列表中缺少的月份,sql,sql-server,Sql,Sql Server,我有一个DateTime类型的列,包含每个月的第一个日期。我想找出没有列在栏中的月份。有什么建议吗 例如: 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/

我有一个DateTime类型的列,包含每个月的第一个日期。我想找出没有列在栏中的月份。有什么建议吗

例如:

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

尝试上述查询,它可能有助于编辑您的问题并提供示例数据和所需结果。从哪个日期开始
-- 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)
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