0
votes

Compter le nombre de jours de chaque mois, après une date

J'essaie de voir si je peux calculer le nombre de jours dans chaque mois, après une date donnée pendant un certain nombre de jours.

Par exemple, j'ai une date du 25/09/2019. Si je prévois les 105 prochains jours, combien de ces jours sont en septembre, octobre, novembre, etc.

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 commentaires

quelle base de données utilisez-vous?


MS SQL Server 2012


Voulez-vous le faire de manière dynamique? Par exemple, si la date est 2019-avril-25, les noms de colonne seront différents.


3 Réponses :


3
votes

Cela me ressemble à Sql server . Vous pouvez le faire en comptant simplement les jours de chaque mois. Le faire de cette façon présente un avantage de flexibilité. Vous pouvez simplement changer @dtdate, @days et la requête fonctionnera malgré le changement du nombre de mois.

year    month   NumberOfDays
2019    December    31
2019    November    30
2019    October     31
2019    September   5
2020    January     8

résultat:

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


0 commentaires

0
votes

Dans postgresql, je le ferais par

9;6
10;31
11;30
12;31
1;8

De toute évidence, vous n'utilisez pas postgresql, mais peut-être que cela vous donnera un indice. L'astuce consiste à créer une série de dates dans l'intervalle que vous pouvez ensuite compter. Voici la sortie avec le mois et le nombre de jours. Notez qu'il y a 106 jours car l'intervalle comprend les dates de début et de fin.

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)


0 commentaires

0
votes

Peut-être pas la meilleure solution (non basée sur un ensemble), mais une approche alternative:

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 commentaires