Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/11/2011, 10h56   #1
Membre habitué
 
Homme
Inscription : avril 2005
Messages : 259
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26

Informations forums :
Inscription : avril 2005
Messages : 259
Points : 102
Points : 102
Par défaut Décalage des dates automatique

Bonjour,

Me revoila avec mes soucis PL/SQL ...

Voici mon soucis :

- nous admettrons que les dates sont FRANÇAISES.

J'ai un script que je lance à un instant T qui va réinitialiser une BDD.
Ce script va insérer des dates D1 et D2.
D1 = 15/01/2011 18h00
D2 = 15/07/2011 18h00

Je souhaiterais que ces dates soient insérées en UTC dans la BDD en tenant compte du décalage de la date au moment de la date.

En clair :
D1 UTC = 15/01/2011 17h00 (car France GMT+1)
D2 UTC = 15/07/2011 16h00 (car France GMT+2 [Heure d'été])

Donc en BDD, j'aurai bien mon décalage d'une heure.

Je pensais réécrire une fonction 'to_date' qui fasse ça ...

Y a t'il une autre solution ?
Si NON, comment puis-je faire ça ?

Je suis entrain de galérer là dessus, dès que j'ai du code je viens le mettre ...

Merci d'avance !
JamesP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 12h37   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Le type TIMESTAMP gère les décalages horaires, pas le type date.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 13h33   #3
Membre habitué
 
Homme
Inscription : avril 2005
Messages : 259
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26

Informations forums :
Inscription : avril 2005
Messages : 259
Points : 102
Points : 102
Je sais que le timestamp gère les timezones, mais ça ne résout malheureusement pas mon souci ...

En fait il suffirait que j'arrive à détecter le décalage horaire d'une date en fonction de sa timezone, à cette même date ...

En algo ça donnerait :
Code :
1
2
3
4
5
6
7
8
fonction toUtcAtDate(Date laDate, Timezone leTZ) {
// ON se positionne à la date voulue
changeDate(laDate);
// ON récupère le timezone
INTERVAL decalage = getDecalageFromUtc();
// ON renvoie le décalage
retourne decalage;
}
Aussi ça donnerait en résultat :
Code :
1
2
toUtcAtDate('15/01/2011', 'Europe/Paris') => "-1" // Car heure hivers en JANVIER donc GMT+1
toUtcAtDate('15/07/2011', 'Europe/Paris') => "-2" // Car heure été en JUILLET donc GMT+2
La subtilité est cette fameuse notion "à la date".

Sachant que je ne peux pas changer le timezone ou la date d'Oracle car je n'ai pas les droits !!!
JamesP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/11/2011, 15h19   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 313
Points : 5 819
Points : 5 819
Utilisez TZ_OFFSET.
Code :
1
2
 
SELECT tz_offset('Europe/Paris') FROM dual
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/11/2011, 17h07   #5
Membre habitué
 
Homme
Inscription : avril 2005
Messages : 259
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26

Informations forums :
Inscription : avril 2005
Messages : 259
Points : 102
Points : 102
Alors j'ai réussi à me construire une solution, peut être pas la plus propre, mais qui marche super !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE OR REPLACE FUNCTION dateToUtc(theDate IN DATE)
RETURN TIMESTAMP
IS
  utcDate TIMESTAMP;
BEGIN
  SELECT SYS_EXTRACT_UTC(cast(theDate AS timestamp))
  INTO utcDate
  FROM dual;
 
  RETURN utcDate;
END dateToUtc;
/
Ensuite :
Code :
1
2
SELECT dateToUtc(to_date('15/01/11 18:00','DD/MM/RR HH24:MI')) FROM dual;
SELECT dateToUtc(to_date('15/07/11 18:00','DD/MM/RR HH24:MI')) FROM dual;
Cela me renvoie respectivement
Code :
1
2
15/01/11 17:00
51/07/11 16:00
Voilaaaaaaaaaaa

Merci encore à vous !
JamesP est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h43.


 
 
 
 
Partenaires

Hébergement Web