【问题标题】:Sql query to generate monthly pay dates within a date rangeSql查询生成日期范围内的每月支付日期
【发布时间】:2017-03-22 21:30:12
【问题描述】:

我想根据给定的日期和日期范围生成每月支付日期。假设我选择“01/30/2016”作为开始支付日期,日期范围是 2016 年。那么支付日期将是 ( 2016 年全年其他月份的第 -1) 个月的总天数。我为支付日期“2016 年 1 月 30 日”的结果集添加了屏幕截图。 我想知道SQL中的查询。

任何帮助将不胜感激。

【问题讨论】:

  • 请提供您为此尝试过的内容
  • @GopalBiswas sql-server 版本是什么?
  • 版本是SQL SERVER 2012。@NEER

标签: sql asp.net sql-server date sql-server-2012


【解决方案1】:

你可以如下:

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

【讨论】:

  • 哇...工作得很好。只要问你什么是 DATEADD 中的“vm”,最后一行 VALUES (1), (2), (3), (4) 是在这个查询中工作。 @NEER
  • @GopalBiswas v.m 是几个月 (1, 2, 3, 4, 5, ... 12) 我创建了几个月并删除了剩余的天数。
【解决方案2】:
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 

【讨论】:

    猜你喜欢
    • 2017-03-23
    • 2018-12-06
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多