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 Réponses :
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
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)
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
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.