IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Convertion date et fuseau horaire


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Par défaut Convertion date et fuseau horaire
    Bonjour,

    Je souhaiterai extraire des dates de SQL server et les transformer en "yyyy-MM-ddTHH:mm:ss" + fuseau horaire dans ma requête mais je ne trouve pas la syntaxe pour faire ce convert.

    Par ailleurs, je ne sais pas si SQL serveur stocke le fuseau horaire dans les dates. Pour info mon champ est de type Datetime.

    example : 08/06/2011 15:36:04 sur fuseau de paris.

    Resultat : 2011-06-08T15:36:04+02:00

    Merci pour votre aide.

  2. #2
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Par défaut
    Je suis sous SQL 2000.

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Il est effectivement bizarre que le format 127 ne le restitue pas.
    Néanmoins la documentation est claire à ce sujet :

    rise en charge uniquement lors de la conversion de données de type caractère en type datetime ou smalldatetime.
    Donc il va falloir écrire une fonction qui fasse le boulot.
    L'idée c'est de mettre le bon signe devant le ABS(DATEDIFF(hour, GETUTCDATE(), GETDATE())) à l'aide d'un CASE.

    En revanche je crois que le Z peut être du style 07:30, ce qui signifie qu'il faudrait prendre la différence en minutes ...

    @++

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Voici la fonction.
    J'ai fait un test sur ma machine (je suis à Bangkok, UTC+7), puis j'ai changé de fuseau horaire pour mettre celui de Newfoundland (UTC-3:30).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE FUNCTION dbo.get_ISO8601_datetimezone
    	(@_date datetime)
    	RETURNS TABLE
    AS
    RETURN
    (
    	SELECT	CONVERT(char(23), @_date, 126)
    		+ CASE
    			WHEN DATEDIFF(minute, GETUTCDATE(), GETDATE()) >= 0 
    				THEN '+' + REPLICATE('0', 2 - LEN(DATEDIFF(hour, GETUTCDATE(), GETDATE())))
    					+ CAST(DATEDIFF(hour, GETUTCDATE(), GETDATE()) AS varchar(2))
    					+ ':' + CASE
    							WHEN DATEDIFF(minute, GETUTCDATE(), GETDATE()) % 60 = 0 THEN '00'
    							ELSE CAST(DATEDIFF(minute, GETUTCDATE(), GETDATE()) % 60 AS char(2))
    						END
    			ELSE '-' + REPLICATE('0', 2 - LEN(ABS(DATEDIFF(hour, GETUTCDATE(), GETDATE()))))
    				+ CAST(ABS(DATEDIFF(hour, GETUTCDATE(), GETDATE())) AS varchar(2))
    				+ ':' + CASE
    						WHEN DATEDIFF(minute, GETUTCDATE(), GETDATE()) % 60 = 0 THEN '00'
    						ELSE CAST(ABS(DATEDIFF(minute, GETUTCDATE(), GETDATE())) % 60 AS char(2))
    					END
    		END AS ISO8601_datetimezone
    )
    Elle retourne la date avec le fuseau horaire de la machine sur laquelle est exécutée la requête ... mais c'est un varchar et pas une date ...

    Utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT		T.desColonnes
    		, (
    			SELECT	ISO8601_datetimezone
    			FROM	dbo.get_ISO8601_datetimezone(T.uneColonne)
    		) AS ISO8601_datetimezone
    FROM		dbo.maTable AS T
    @++

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 87
    Par défaut
    Superbe travail sur les chaines de données

    Merci, mais elle ne fonctionne pas sous SQL 2000 .

    Msg*443, Niveau*16, État*1, Procédure*get_ISO8601_datetimezone, Ligne*9
    Utilisation incorrecte de 'getutcdate' à l'intérieur d'une fonction.

Discussions similaires

  1. Comment transmettre une date avec fuseau horaire ?
    Par flexx dans le forum Services Web
    Réponses: 6
    Dernier message: 17/10/2012, 12h55
  2. PHP: Date et fuseau horaire
    Par pascal_22 dans le forum Langage
    Réponses: 0
    Dernier message: 21/11/2011, 16h25
  3. [DATE] Créer une date selon fuseau horaire
    Par Tomus dans le forum Débuter
    Réponses: 2
    Dernier message: 24/02/2010, 03h30
  4. [Dates] Changer le fuseau horaire
    Par nanomag dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2006, 14h34
  5. Date - fuseau horaire
    Par sparton dans le forum Collection et Stream
    Réponses: 16
    Dernier message: 11/01/2006, 15h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo