基于月末日期生成月度付款日期的Sql查询
我想根据一年的月工资和月底日期生成月工资日期。假设我选择2016年1月26日为工资日期,2016年1月31日为月底日期,日期范围为2016年。 那么,月底日期将是该年当月的最后一天,支付日期将是该月的月底日期-2016年其他月份的第th个月支付日期。我已经为2016年1月26日和2016年1月31日作为月末日期的支付日期添加了结果集的屏幕截图。我的SQL版本是2012。 我想知道SQL中的查询 任何帮助都将不胜感激 付款日期为2016年8月2日,月末为2016年31月1日的屏幕截图 与您的相同逻辑 您可以按以下方式进行操作:基于月末日期生成月度付款日期的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日的屏幕截图 与您的相同逻
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在某些条件下完成。