0
votes

Obtenez une date de la semaine et de l'année ISO en SQL

de la semaine et de l'année ISO, j'aimerais avoir une date. La date devrait être le premier jour de la semaine. Le premier jour de la semaine est lundi. Par exemple, la Semaine ISO 10 et l'année ISO devrait convertir en 2019-03-04. J'utilise le flocon de neige


3 commentaires

Salut jmf, tu n'as pas la table de dimension de date? Si vous avez, vous devez stocker le numéro IsoWeek. Il sera très facile de trouver le premier jour de la semaine ISO.


Nous n'avons pas de table de dimension de date. Mais ce pourrait être une bonne idée de en créer un.


J'ai créé un UDF pour faire le travail: Stackoverflow.com/a/66866186/132438


3 Réponses :


0
votes

Si vous n'avez pas de table de dimension et / ou de utilitaires, comme indiqué dans les commentaires, vous devez l'analyser à partir d'une forme textuelle. Mais ce serait une implémentation de la SGBD dépendant:

  • dans mysql: str_to_date (Concat (année, '', semaine), '% x% V')
  • dans PostgreSQL: to_date (année || '' || week, 'iyyy iw')
    (également Oracle DB serait quelque chose de similaire)

1 commentaires

Nous avons la base de données de flocon de neige



0
votes

Malheureusement, le flocon de neige ne prend pas en charge cette fonctionnalité de manière native.

Bien qu'il soit possible de calculer manuellement la date de la semaine et de l'année ISO, c'est très complexe. Donc, comme les autres suggérées, générer une table de dimension de date pour cela est beaucoup plus facile. P>

Exemple d'une requête pouvant le générer pour la recherche (note - Ce n'est pas une table de dimension de la date totale - qui est typiquement une Rangée par jour, c'est une ligne par semaine). P>

create or replace table iso_week_lookup as 
select 
  date_part(yearofweek_iso, d) year_iso, 
  date_part(week_iso, d) week_iso, 
  min(d) first_day 
from (
  select dateadd(day, row_number() over (order by 1) - 1, '2000-01-03'::date) AS d 
  from table(generator(rowCount=>10000))
) 
group by 1, 2 order by 1,2;

select * from iso_week_lookup limit 2;
----------+----------+------------+
 YEAR_ISO | WEEK_ISO | FIRST_DAY  |
----------+----------+------------+
 2000     | 1        | 2000-01-03 |
 2000     | 2        | 2000-01-10 |
----------+----------+------------+

select min(first_day), max(first_day) from iso_week_lookup;
----------------+----------------+
 MIN(FIRST_DAY) | MAX(FIRST_DAY) |
----------------+----------------+
 2000-01-03     | 2027-05-17     |
----------------+----------------+

select * from iso_week_lookup where year_iso = 2019 and week_iso = 10;
----------+----------+------------+
 YEAR_ISO | WEEK_ISO | FIRST_DAY  |
----------+----------+------------+
 2019     | 10       | 2019-03-04 |
----------+----------+------------+


0 commentaires

1
votes

L'expression de date à faire est un peu complexe, mais pas impossible: xxx


1 commentaires

J'ai créé un UDF hors de ce code: Stackoverflow.com/a/66866186/132438