2016-11-09 85 views
0

我想基于一个月的“月薪”和“月末”日期生成月薪日期。假设我选择了“01/26/2016 “作为”支付日期“和”01/31/2016“作为”月末“日期和日期范围是2016年。 然后,”月末“日期将是该年的月份的最后一天和支付日期将在2016年全年的其他月份为(“月末”月份日期 - 月“”的“付款日期”)。我添加了支付日期“01/26/2016”和“01/31/2016”作为“月末”日期。我的SQL版本是2012. 我想知道SQL中的查询。sql查询基于月结束日期生成月薪日期

任何帮助将不胜感激。

enter image description here

截图为 “2016年2月8日” 为 “支付日” 和 “2016年1月31日” 为 “月末” enter image description here

+0

基本上你需要得到**的时间差**所选月份的最后一天**和**选择的支付日期之间的**和应用**与其他月份相同的差异**。这是你的要求吗? – Viki888

+0

正确@ viki888 –

回答

1

同样的逻辑与last question

您可以按以下:

DECLARE @StartDate DATETIME = '2016.01.26' 
DECLARE @EndDate DATETIME = '2016.01.31' 

SELECT 
    DATENAME(dw, A.Month) DayNameOfMonth, 
    A.[Month], 
    DATENAME(dw, A.[Pay Date]) DayNameOfPayDate, 
    A.[Pay Date] 
FROM 
(
    SELECT 
     DATEADD(DAY, -1 - (DAY(EOMONTH(@EndDate)) - DAY(@EndDate)), DATEADD(MONTH, v.m, DATEFROMPARTS(YEAR(@EndDate), 1, 1))) 'Month', 
     DATEADD(DAY, -1 - (DAY(EOMONTH(@StartDate)) - DAY(@StartDate)), DATEADD(MONTH, v.m, DATEFROMPARTS(YEAR(@StartDate), 1, 1))) 'Pay Date' 
    FROM 
     (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) AS v(m) 
) A 

结果:

DayNameOfMonth     Month  DayNameOfPayDate    Pay Date 
------------------------------ ---------- ------------------------------ ---------- 
Sunday       2016-01-31 Tuesday      2016-01-26 
Monday       2016-02-29 Wednesday      2016-02-24 
Thursday      2016-03-31 Saturday      2016-03-26 
Saturday      2016-04-30 Monday       2016-04-25 
Tuesday      2016-05-31 Thursday      2016-05-26 
Thursday      2016-06-30 Saturday      2016-06-25 
Sunday       2016-07-31 Tuesday      2016-07-26 
Wednesday      2016-08-31 Friday       2016-08-26 
Friday       2016-09-30 Sunday       2016-09-25 
Monday       2016-10-31 Wednesday      2016-10-26 
Wednesday      2016-11-30 Friday       2016-11-25 
Saturday      2016-12-31 Monday       2016-12-26 

修订

DECLARE @StartDate DATETIME = '2016.01.31' -- month end 
DECLARE @EndDate DATETIME = '2016.02.08' -- pay date 

SELECT   
    DATEADD(DAY, -1 - (DAY(EOMONTH(@StartDate)) - DAY(@StartDate)), DATEADD(MONTH, v.m, DATEFROMPARTS(YEAR(@StartDate), 1, 1))) 'Month End',   
    DATEADD(DAY, DATEDIFF(DAY, @StartDate, @EndDate), DATEADD(DAY, -1 - (DAY(EOMONTH(@StartDate)) - DAY(@StartDate)), DATEADD(MONTH, v.m, DATEFROMPARTS(YEAR(@StartDate), 1, 1)))) 'Pay Date' 
FROM 
    (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) AS v(m) 

更新2

DECLARE @StartDate DATETIME = '2016.01.31' -- month end 
DECLARE @EndDate DATETIME = '2016.02.08' -- pay date 

SELECT 
    * 
FROM 
(
    SELECT   
     DATEADD(DAY, -1 - (DAY(EOMONTH(@StartDate)) - DAY(@StartDate)), DATEADD(MONTH, v.m, DATEFROMPARTS(YEAR(@StartDate), 1, 1))) 'Month End',   
     DATEADD(DAY, DATEDIFF(DAY, @StartDate, @EndDate), DATEADD(DAY, -1 - (DAY(EOMONTH(@StartDate)) - DAY(@StartDate)), DATEADD(MONTH, v.m, DATEFROMPARTS(YEAR(@StartDate), 1, 1)))) 'Pay Date' 
    FROM 
     (VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) AS v(m) 
) A 
WHERE 
    YEAR(A.[Pay Date]) = YEAR(@EndDate) 
+0

感谢您的回复,但如果我输入'2016.01.31'作为“月末”日期和'2016.02.08'作为“付款日期”,则输出与我期望的结果不符。 @NEER –

+0

@GopalBiswas请问您能展示想要的结果吗? – NEER

+0

请参阅编辑的问题@NEER –

1

试试这个

DECLARE @PayDate AS DATE = '2016-Jan-26', @MonthEndDate AS DATE = '2016-Jan-31' 
DECLARE @Start AS INT = 0, @End AS INT = 11 
DECLARE @DateDiff AS INT = (SELECT DATEDIFF(DAY, @PayDate, @MonthEndDate)) 

; WITH CTE AS 
(
SELECT @Start as number 
UNION ALL 
SELECT number + 1 
FROM CTE 
WHERE number < @End 
) SELECT 

DATENAME(dw, DATEADD(MONTH, number, @MonthEndDate)) + ', ' + convert(varchar(12), DATEADD(MONTH, number, @MonthEndDate), 113) AS MonthEnd, 
DATENAME(dw, DATEADD(DAY, [email protected], DATEADD(MONTH, number, @MonthEndDate))) + ', ' + convert(varchar(12), DATEADD(DAY, [email protected], DATEADD(MONTH, number, @MonthEndDate)), 113) AS PayDate 
FROM CTE 

/* Output: 
MonthEnd     PayDate 
--------------------------------------------------- 
Sunday, 31 Jan 2016   Tuesday, 26 Jan 2016 
Monday, 29 Feb 2016   Wednesday, 24 Feb 2016 
Thursday, 31 Mar 2016  Saturday, 26 Mar 2016 
Saturday, 30 Apr 2016  Monday, 25 Apr 2016 
Tuesday, 31 May 2016  Thursday, 26 May 2016 
Thursday, 30 Jun 2016  Saturday, 25 Jun 2016 
Sunday, 31 Jul 2016   Tuesday, 26 Jul 2016 
Wednesday, 31 Aug 2016  Friday, 26 Aug 2016 
Friday, 30 Sep 2016   Sunday, 25 Sep 2016 
Monday, 31 Oct 2016   Wednesday, 26 Oct 2016 
Wednesday, 30 Nov 2016  Friday, 25 Nov 2016 
Saturday, 31 Dec 2016  Monday, 26 Dec 2016 
*/ 
+0

只有一次更改需要“PayDate”应该在一年内。请参阅已编辑的问题@Tanjim Rahman –

+0

您所要求的只是简单的逻辑更改,可以在'@ DateDiff'的某些条件下完成。 – Esty

0
DECLARE @Y int = 2016; 

SELECT RD.ME MonthEnd, RD.PD PayDate FROM 
(select 
1 as mth 
union 
select 2 
union 
select 3 
union 
select 4 
union 
select 5 
union 
select 6 
union 
select 7 
union 
select 8 
union 
select 9 
union 
select 10 
union 
select 11 
union 
select 12) M 
CROSS APPLY (SELECT DATEADD(month, M.mth - 1, DATEADD(year, @y - 1900, 0)) RM) OA 
CROSS APPLY (SELECT DATEADD(day, -1 , DATEADD(month, 1, OA.RM)) ME, DATEADD(day, -6 , DATEADD(month, 1, OA.RM)) PD) RD ORDER BY RD.ME 
相关问题