Подсчет количества дней в каждом месяце, следующих за датой - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь выяснить, могу ли я рассчитать количество дней в каждом месяце после указанной даты для определенного количества дней.

Например, у меня дата 2019-09-25. Если я планирую на следующие 105 дней, сколько из них будет в сентябре, октябре, ноябре и т. Д.

Declare @dtdate date = '20190925',
@days int= 105

Select 
datediff(dd,@dtdate,eomonth(@dtdate)) as DaysSeptember
,datediff(dd,eomonth(@dtdate),eomonth(dateadd(m,1,@dtdate))) as DaysOctober

Ответы [ 3 ]

3 голосов
/ 11 июня 2019

Это выглядит как Sql server. Вы можете сделать это, просто считая дни в каждом месяце. Делать это таким образом имеет преимущество гибкости. Вы можете просто изменить @dtdate, @days, и запрос будет работать, несмотря на изменение количества месяцев.

DECLARE @dtdate date = '20190925', 
@days int= 105
,@dtmax date;
set @dtmax = dateadd(day, @days, @dtdate);

WITH cte AS (
  SELECT DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY 1/0), @dtdate) AS d
  FROM sys.objects s, sys.objects s2
)
select
    year(d) as year, datename(month, d) as month, count(*) as NumberOfDays
from cte
where d between @dtdate and @dtmax
group by year(d), datename(month, d)
order  by year(d), month

результат:

year    month   NumberOfDays
2019    December    31
2019    November    30
2019    October     31
2019    September   5
2020    January     8
0 голосов
/ 11 июня 2019

Возможно, не лучшее решение (не на основе множества), но альтернативный подход:

DECLARE @dtdate      DATE = '20190925'
       ,@days        INT  = 105
       ,@DaysInMonth INT

DECLARE @results TABLE
    (
        ResultsID   INT        NOT NULL IDENTITY PRIMARY KEY
       ,YearMonth   VARCHAR(7) NOT NULL
       ,DaysInMonth INT        NOT NULL
    )


WHILE @days > 0
    BEGIN
        SET @DaysInMonth = DATEDIFF(dd, @dtdate, EOMONTH(@dtdate))
        SET @DaysInMonth = IIF(@days > @DaysInMonth, @DaysInMonth, @days)

        INSERT INTO @results
            (
                YearMonth
               ,DaysInMonth
            )
        SELECT  CONVERT(VARCHAR(7), @dtdate, 120)
               ,@DaysInMonth

        SET @days -= @DaysInMonth
        SET @dtdate = DATEADD(dd, 1, EOMONTH(@dtdate))
    END


SELECT  *
FROM    @results AS r
0 голосов
/ 11 июня 2019

В postgresql я бы сделал это

SELECT date_part('month', d), count(d)
FROM generate_series('2019-09-25'::date, '2019-09-25'::date + INTERVAL '105 days', INTERVAL '1 day') series (d)
GROUP BY date_part('year',d), date_part('month', d)
ORDER BY date_part('year',d), date_part('month', d)

Очевидно, что вы не используете postgresql, но, возможно, это даст вам подсказку. Хитрость заключается в том, чтобы создать серию дат в пределах интервала, который вы затем можете посчитать. Вот вывод с месяцем и количеством дней. Обратите внимание, что есть 106 дней, потому что интервал включает даты начала и окончания.

9;6
10;31
11;30
12;31
1;8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...