0
votes

Comment démarrer et terminer la même semaine l'année dernière dans DB2 en utilisant SQL?

J'ai un rapport hebdomadaire qui utilise ces paramètres de date:

SELECT  *
FROM    TABLE
WHERE   DATE_FIELD BETWEEN (CURRENT DATE - 8 DAYS) AND (CURRENT DATE - 2 DAYS)

Il s'exécute le lundi pour collecter les données de la semaine précédente (dim-sam). Ce que je veux maintenant, c'est l'exécuter pour la même semaine de l'année précédente.

Par exemple, si le code ci-dessus s'exécute le lundi 29/06/20, il renvoie les données du dimanche 21/06 / 20 - Sam 27/06/20, soit la semaine 26 de 2020. Je veux qu'il renvoie les données du dim 23/06/19 au sam 29/06/19, soit la semaine 26 de 2019.

Le Le rapport s'exécute automatiquement, donc je ne peux pas simplement brancher les dates exactes à chaque fois. Je ne peux pas non plus simplement compenser les paramètres de date à -357 et -367 jours, car cela est gâché par les années bissextiles.

J'ai cherché des solutions, mais elles semblent toutes s'appuyer sur la fonction DATEADD , que ma base de données DB2 ne reconnaît pas.

Quelqu'un sait-il comment je peux obtenir le résultat que je recherche, s'il vous plaît? Tout avis sera le bienvenu! :)


0 commentaires

3 Réponses :


0
votes

Si vous supposez que toutes les années ont 52 semaines, vous pouvez utiliser l'arithmétique des dates:

SELECT  *
FROM    TABLE
WHERE   DATE_FIELD BETWEEN (CURRENT DATE - (8 + 364) DAYS) AND (CURRENT DATE - (2 + 364)  DAYS)

Parce que vous voulez que la semaine commence un lundi, cela ne doit pas prendre des années bissextiles en compte. Cela soustrait exactement 52 semaines - et les années bissextiles n'affectent pas les semaines.

Cela devient plus compliqué si vous devez gérer des années de 52 ou 53 semaines.


0 commentaires

0
votes

Un peu compliqué, mais ça devrait marcher. Vous pouvez l'exécuter tel quel ou tester votre propre date.

SELECT 
  YEAR_1ST_WEEK_END + WEEKS_TO_ADD * 7 - 6 AS WEEK_START
, YEAR_1ST_WEEK_END + WEEKS_TO_ADD * 7     AS WEEK_END
FROM
(
SELECT
  DATE((YEAR(D) - 1)||'-01-01')
+ (7 - DAYOFWEEK(DATE((YEAR(D) - 1)||'-01-01'))) AS YEAR_1ST_WEEK_END
, WEEK(D) - 2 AS WEEKS_TO_ADD
FROM (VALUES DATE('2020-06-29')) T(D)
);

La valeur de la colonne intermédiaire YEAR_1ST_WEEK_END est le 1er samedi (fin de semaine) de l'année précédente pour date donnée.
WEEKS_TO_ADD est un nombre de semaines à ajouter à la date YEAR_1ST_WEEK_END .


0 commentaires

0
votes

Le moyen le plus simple de le faire est de créer un calendrier ou un tableau de dates ... (google sql calendar table )

Parmi les colonnes que vous auriez, il y aurait

  • date
  • année
  • mois
  • trimestre
  • jour de la semaine
  • startOfWeek
  • endOfWeek
  • semaine_nbr

Vous pouvez utiliser les fonctions week () ou week_iso () lors du chargement de la table, faites attention aux différences et choisissez celle qui vous convient le mieux.

Un tel tableau de calendrier permet de comparer facilement la période actuelle à la période précédente.


0 commentaires