2009-02-03 5 views
1

Comment convertir une année-semaine (p. Ex. 0852 ou 200852) en une date (p. Ex. 2008-12-31 ou plus précisément un jour de fin de semaine, p. Ex. Samedi 2008-12-27 ou un jour de début de semaine c.-à-d. -21)? N'importe quel jour du week-end fera, vendredi, samedi, dimanche ou lundi.Comment convertir une semaine (200851) en une date (2008-12-27)?

+0

Dans quelle base de données êtes-vous? –

+0

Plus d'informations nécessaires - dépend de l'endroit où se termine la semaine 1, et si cela doit être une semaine complète ou non. –

+0

La semaine ISO se termine le dimanche et la première semaine contient toujours le 4 janvier. – Quassnoi

Répondre

3

MS SQL Server a DATEADD functionallity qui devrait aider ...

DECLARE @date_string NCHAR(6) 
SELECT @date_string = N'200852' 

SELECT DATEADD(
      WEEK, 
      CAST(RIGHT(@date_string, 2) AS INT), 
      DATEADD(
       YEAR, 
       CAST(LEFT(@date_string, 4) AS INT) - 1900, 
       0 
      ) 
     ) 

EDIT:

Désolé, manqué le peu de faire un samedi, etc ...

Une fois que vous avez la valeur, utilisez DATEPART pour obtenir ce jour de la semaine, il est, et soustrayez de votre réponse ...

DECLARE @new_date DATETIME 
SELECT @new_date = '2008 Dec 30' 

SELECT DATEADD(DAY, 1-DATEPART(dw, @new_date), @new_date) 

Ceci amènera la valeur au début de la semaine, en fonction de ce que vous avez défini DATEFIRST.

1

Dans Oracle:

SELECT TO_DATE('04.01.' || SUBSTR(iso, 1, 4)) + (TO_NUMBER(SUBSTR(iso, 5, 2))) * 7 - TO_CHAR(TO_DATE('04.01.' || SUBSTR(iso, 1, 4)), 'D') 
FROM (
    SELECT '200101' AS iso 
    FROM dual 
    ) 
1

Si cela est dans Oracle, consultez la fonction TO_DATE avec différentes options, YYYYWW. sélectionnez TO_Date ('2008Y' YYYYWW) à partir du double; Une fois que vous obtenez le début de la semaine, vous pouvez toujours ajouter le nombre de jours pour obtenir la date du week-end.

2

Les fonctions de date sont assez spécifiques à la base de données. Dans MySQL par exemple, vous pouvez faire ce qui suit pour obtenir le lundi de la semaine au format 'YYYYWW':

select date_sub(makedate(left('YYYYWW', 4), 1 + (right('YYYYWW', 2) - 1) * 7), 
interval weekday(makedate(left('YYYYWW', 4), 1 + (right('YYYYWW', 2) - 1) * 7)) DAY); 

Avec MAKEDATE (à gauche ('YYYYWW', 4), 1 + (à droite ('YYYYWW' , 2) - 1) * 7) vous obtiendrez une date qui est définitivement dans la semaine et l'année données, et avec la fonction date_sub nous revenons au lundi de cette semaine.

Exemples:

  • pour '200906' ce retournerait « 2009-02-02
  • pour '200901' il retournerait '2008-12-29' (ce qui est en fait le lundi semaine 1 de 2009)
4

Voici une solution presque indépendante de la base de données, si c'est important.

Créez une table appelée ALMANAC, clé primaire DATE, qui répertorie tous les attributs d'une date que vous prévoyez d'utiliser. L'un d'eux pourrait être ANNÉE, un autre pourrait être une SEMAINE. Vous pouvez inclure toutes les fonctions informatiques DATE que vous voulez utiliser. Vous pouvez également inclure des attributs DATE spécifiques à l'entreprise, comme si la date est un jour férié pour l'entreprise.

Ecrivez un programme pour remplir le DATE par exemple pendant 10 ans (environ 3650 lignes plus quelques années bissextiles). Ce programme utilisera les fonctions de date spécifiques à l'environnement disponibles dans le SGBD de dans un langage de programmation. Une fois que vous avez rempli la table ALMANAC, utilisez-la comme des données ordinaires. Rejoignez la clé primaire avec tous les champs Date de votre base de données.

Cela s'avère extrêmement utile pour préparer un rapport par semaine, par mois, par trimestre et par année, presque automatiquement.

Si DATE n'est pas suffisamment granulaire, vous pouvez même diviser l'Almanach en unités de temps plus petites, comme les décalages où 3 décalages sont d'un jour.

Questions connexes