J'utilise SQL Server 2014 et j'ai la requête T-SQL suivante:
Date Period Day
-------------------------------
2016-07-01 FY 16-17 D1
2016-07-02 FY 16-17 D2
2016-07-03 FY 16-17 D3
... ... ...
2017-07-01 FY 17-18 D1
2017-07-02 FY 17-18 D2
2017-07-03 FY 17-18 D3
... ... ...
2018-07-01 FY 18-19 D1
2018-07-02 FY 18-19 D2
2018-07-03 FY 18-19 D3
... ... ...
5 Réponses :
Utilisez Row_Number () CODE> with cte as
(
SELECT [Date]
,(CASE WHEN [Date] between '2016-07-01' and '2017-06-30' THEN 'FY 16-17'
WHEN [Date] between '2017-07-01' and '2018-06-30' THEN 'FY 17-18'
WHEN [Date] between '2018-07-01' and '2019-06-30' THEN 'FY 18-19'
ELSE 'Not Stated'
END) as [Period]
FROM DateDimension
)
select *,concat('D',row_number() over(partition by period order by date)) as DayNo
from cte
Il semble que vous manquiez le point que vous devez commencer à compter le 1er juillet.
En outre, une seule journée manquante dans la table tourne Row_Number () code> dans la citrouille.
Vous pouvez utiliser datrodiff code> pour avoir la différence entre le début de l'exercice et [date] code>. SELECT
[Date]
,(CASE WHEN [Date] between '2016-07-01' and '2017-06-30' THEN 'FY 16-17'
WHEN [Date] between '2017-07-01' and '2018-06-30' THEN 'FY 17-18'
WHEN [Date] between '2018-07-01' and '2019-06-30' THEN 'FY 18-19'
ELSE 'Not Stated'
END) as [Period]
, CASE WHEN [Date] < DATEFROMPARTS(DATEPART(Year, GETDATE()), 7, 1)
THEN CONCAT('D', (DATEDIFF(DAY, DATEFROMPARTS(DATEPART(Year, [Date]) - 1, 7, 1), [Date] + 1)))
ELSE CONCAT('D', (DATEDIFF(DAY, DATEFROMPARTS(DATEPART(Year, [Date]), 7, 1), [Date] + 1)))
END AS [Day]
FROM DateDimension
WHERE [Date] between '2016-07-01' and '2019-06-30'
Voici un exemple de la manière dont vous pouvez simplifier votre calcul de l'exercice existant et obtenir le jour de l'exercice:
declare @date date = '20190702'; select year(dateadd(month, -6, @date)) as [FY], datediff(day, datefromparts(year(dateadd(month, -6, @date)), 6, 30), @date) as [DOFY];
Vous pouvez utiliser datrodiff code> pour calculer le nombre de jours dans cette exercice. Vous avez juste besoin d'un effort supplémentaire pour obtenir la première date d'année financière pour la colonne Date. +-------------------------+-----------+
| DATE | DAY_IN_FY |
+-------------------------+-----------+
| 2019-03-25 00:00:00.000 | D268 |
| 2018-12-06 00:00:00.000 | D159 |
| 2018-05-15 00:00:00.000 | D319 |
| 2017-11-22 00:00:00.000 | D145 |
| 2019-07-06 00:00:00.000 | D6 |
+-------------------------+-----------+
Je veux souligner que vous pouvez exprimer la requête comme suit: la période code> peut également être définie comme suit: p> (VALUES (CONCAT(YEAR([Date] % 100, '-',
1 + YEAR([Date] % 100
)
)
) as v(period)
Vous sélectionnez à partir d'une table appelée
daturdimension code>. Je m'attendrais à ce que ce tableau contienne déjà des colonnes liées à la date telles que l'année financière de la date actuelle appartenance à ce jour et quel jour il est dans cet exercice ...