基于月末日期生成月度付款日期的Sql查询

基于月末日期生成月度付款日期的Sql查询,sql,sql-server,sql-server-2008,date,sql-server-2012,Sql,Sql Server,Sql Server 2008,Date,Sql Server 2012,我想根据一年的月工资和月底日期生成月工资日期。假设我选择2016年1月26日为工资日期,2016年1月31日为月底日期,日期范围为2016年。 那么,月底日期将是该年当月的最后一天,支付日期将是该月的月底日期-2016年其他月份的第th个月支付日期。我已经为2016年1月26日和2016年1月31日作为月末日期的支付日期添加了结果集的屏幕截图。我的SQL版本是2012。 我想知道SQL中的查询 任何帮助都将不胜感激 付款日期为2016年8月2日,月末为2016年31月1日的屏幕截图 与您的相同逻

我想根据一年的月工资和月底日期生成月工资日期。假设我选择2016年1月26日为工资日期,2016年1月31日为月底日期,日期范围为2016年。 那么,月底日期将是该年当月的最后一天,支付日期将是该月的月底日期-2016年其他月份的第th个月支付日期。我已经为2016年1月26日和2016年1月31日作为月末日期的支付日期添加了结果集的屏幕截图。我的SQL版本是2012。 我想知道SQL中的查询

任何帮助都将不胜感激

付款日期为2016年8月2日,月末为2016年31月1日的屏幕截图

与您的相同逻辑

您可以按以下方式进行操作:

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
更新

更新2

同样的逻辑也适用于你的

您可以按以下方式进行操作:

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
更新

更新2

试试这个

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, -@DateDiff, DATEADD(MONTH, number, @MonthEndDate))) + ', ' + convert(varchar(12), DATEADD(DAY, -@DateDiff, 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
*/
试试这个

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, -@DateDiff, DATEADD(MONTH, number, @MonthEndDate))) + ', ' + convert(varchar(12), DATEADD(DAY, -@DateDiff, 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
*/

基本上,您需要获得所选月末日期和所选付款日期之间的日期差异,并将相同的差异应用于所有其他月份。这是您的要求吗?请更正@Viki888基本上您需要获得所选月末日期和所选付款日期之间的日期差异,并将相同的差异应用于所有其他月份。这是您的要求吗?正确@Viki888谢谢您的回复,但如果我输入“2016.01.31”作为月末日期,输入“2016.02.08”作为支付日期,则输出与我的期望结果不匹配@付款日期必须在一年内,但只有一项条款是必需的@尼尔坦克斯又来了…:@Neer感谢您的回复,但如果我输入“2016.01.31”作为月末日期,输入“2016.02.08”作为支付日期,则输出与我的期望结果不匹配@付款日期必须在一年内,但只有一项条款是必需的@尼尔坦克斯又来了…:@付款日期应在一年内,无需任何更改。请参见编辑后的问题@Tanjim Rahman您所问的是简单的逻辑更改可以通过@DateDiff在某些条件下完成。只需一次更改,付款日期应在一年内。请参见编辑后的问题@Tanjim Rahman您所问的是简单的逻辑更改可以通过@DateDiff在某些条件下完成。