2016-11-09 151 views
0

我想基于给定的日期和日期范围生成月薪日期。假设我选择了“01/30/2016”作为起始支付日期和日期范围是在2016年的其他月份中,薪资日期将为(其第几个月的总天数为-1)。我为薪酬日期“01/30/2016”添加了结果集屏幕截图。 我想知道SQL中的查询。sql查询生成日期范围内的月薪日期

任何帮助将不胜感激。

enter image description here

+0

请提供一下您尝试过这个 – Viki888

+0

@GopalBiswas什么是SQL-服务器版本? – NEER

+0

该版本是SQL SERVER 2012. @NEER –

回答

2

您可以按以下:

DECLARE @SelectedDate DATETIME = '2016.01.30' 
SELECT 
    DATEADD(DAY, -1 - (DAY(EOMONTH(@SelectedDate)) - DAY(@SelectedDate)), DATEADD(MONTH, v.m, DATEFROMPARTS(YEAR(@SelectedDate), 1, 1))) 
FROM 
    (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) AS v(m) 

多少天都在每个月的月底前离开。发现的天数从其他月份中删除。

DAY(EOMONTH(@SelectedDate)(31) - DAY(@SelectedDate)(30)= left days(1)

结果:

2016-01-30 
2016-02-28 
2016-03-30 
2016-04-29 
2016-05-30 
2016-06-29 
2016-07-30 
2016-08-30 
2016-09-29 
2016-10-30 
2016-11-29 
2016-12-30 
+1

WOW ...完美运行。只需要问一下,DATEADD中的“vm”和最后一行VALUES(1),(2),(3),( 4)正在这个查询中工作。 @NEER –

+0

@GopalBiswas v.m是几个月(1,2,3,4,5,... 12)我创建了几个月并删除了剩余的日子。 – NEER

+1

谢谢。 @NEER –

0
DECLARE @StartDate VARCHAR(10) = '01/30/2016', 
     @EndDate VARCHAR(10)='12/30/2016'; 

WITH _CTEDate(_date, _NextMonth) 
    AS (SELECT CONVERT(DATE, @StartDate, 101), 
       Eomonth(@StartDate, 1) 
     UNION ALL 
     SELECT Dateadd(DAY, -1, _NextMonth), 
       Eomonth(Dateadd(M, 1, _date), 1) 
     FROM _CTEDate 
     WHERE _date < CONVERT(DATETIME, @EndDate, 101)) 
SELECT Datename(DW, _date)    [WeekDay], 
     Cast(Day(_date) AS VARCHAR(2)) + ' ' 
     + Datename(MONTH, _date) + ' ' + ' ' 
     + Cast(Year(_date) AS VARCHAR(4)) AS [Date] 
FROM _CTEDate