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

MS SQL Server Discussion :

Problème de conversion de date


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 431
    Points : 129
    Points
    129
    Par défaut Problème de conversion de date
    Bonjour,

    Je suis désolé mon sujet marche sur 3 thèmes en même temps j'espère être dans la bonne section de forum.

    J'explique rapidement, je suis en train de faire un script qui prend le contenu d'une table mssql, pour le copier dans une autre table MySQL cette fois, et le script est fais en PHP.

    Pour faire simple des données sont enregistré dans une table, dont un champ datetime au format américain. Pour copier le contenu je fais en PHP un while, je construis ma requête, et je l'affiche pour voir si j’obtiens bien se que je désire.
    Et la surprise ma date est au format français. J'ai tout de meme continué afin de voir si ce n'étais pas un tour de mon navigateur. Le champ date de mon insertion se retrouve a 0000 mais format américain. C'est donc qu'il n'a pas comprit. J'ai testé avec d'autre navigateur, c'est le même cirque.

    Quelqu'un a une idée du pourquoi?

    J’espère avoir été assez clair.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Un format de date cela n'existe pas dans un SGBDR. Une date est un type de données. A lire : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L7

    A +

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 431
    Points : 129
    Points
    129
    Par défaut
    Cela viendrai donc de mon Sql server?
    Si c'est le cas comment modifie t'il le flag DATEFORMAT?

    Si je fait cela ne va t'il pas y avoir des conséquence sur le autres table?
    ne peut t'on pas simplement l’empêcher de faire la conversion?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 431
    Points : 129
    Points
    129
    Par défaut
    Je raconte des annerie , mon format de base est ceci
    "2012-04-13 14:03:06.450"
    celui que je récupère est celui la
    "Apr 13 2012 1:55PM"

    enfin je suppose que le problème est bien, sql server, j'ai fait d'autre test avec des navigateur ou des VM avec d'autre wamp ou easyphp, le résultat est le même.
    Le problème est que je ne sais pas quel impacte aura la modification du Server sql sur les autres traitement, cela peut être terrible.

    Je pense que je vais devoir prendre mes petites main et coder une fonction adapté?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Vous ne comprenez toujours pas. Une date est un type date et n'a pas de format.... Vous pourrez donc toujours faire par exemple DateA = DateB pourvu que DateA et DateB soient des colonnes de type DATE (ou DATETIME) ou des variables de type DATE (ou DATETIME).

    Donc à un moment ou un autre vous transformez votre date en chaine de caractères et c'est là que vous merdez....

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CAST(CURRENT_TIMESTAMP AS VARCHAR(38))
     
    SELECT CONVERT(CHAR(38), CURRENT_TIMESTAMP, 121)

    A +

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 431
    Points : 129
    Points
    129
    Par défaut
    Bonjour,
    Si je comprend bien
    "Apr 13 2012 1:55PM" serai donc une date, et si je vous comprend bien je peux faire des comparaison avec d'autre date, sql se débrouillera car il s'agit de date c'est bien cela?

    Alors si nous restons sur la même idée, j'ai donc un champs date a laquelle j'ajoute pour chaque enregistrement la date du jour, et quand je fait un simple SELECT je retrouve "Apr 13 2012 1:55PM" au lieu de "2012-04-13 14:03:06.450".

    Bon si je fait un INSERT d'un SELECT de ma table dans une table identique, mssql m'envoi sur les rose et me dis que le format date n'est pas bon. Ce sont ces dires. Dans mes deux requêtes il n'y a pas eu de transformation de ma date en string ou pas intentionnellement.

    j'ai plutôt l'impression que sql Server fait l’âne et change de lui même le format.

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Citation Envoyé par darkterreur Voir le message
    Bon si je fait un INSERT d'un SELECT de ma table dans une table identique, mssql m'envoi sur les rose et me dis que le format date n'est pas bon. Ce sont ces dires. Dans mes deux requêtes il n'y a pas eu de transformation de ma date en string ou pas intentionnellement.
    Définition des tables et code de ladite requête svp ?

    Citation Envoyé par darkterreur Voir le message
    j'ai plutôt l'impression que sql Server fait l’âne et change de lui même le format.
    Et personne n'aurait rien remarqué avant vous ???

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par darkterreur Voir le message
    Bonjour,
    Si je comprend bien
    "Apr 13 2012 1:55PM" serai donc une date, et si je vous comprend bien je peux faire des comparaison avec d'autre date, sql se débrouillera car il s'agit de date c'est bien cela?

    Alors si nous restons sur la même idée, j'ai donc un champs date a laquelle j'ajoute pour chaque enregistrement la date du jour, et quand je fait un simple SELECT je retrouve "Apr 13 2012 1:55PM" au lieu de "2012-04-13 14:03:06.450".

    Bon si je fait un INSERT d'un SELECT de ma table dans une table identique, mssql m'envoi sur les rose et me dis que le format date n'est pas bon. Ce sont ces dires. Dans mes deux requêtes il n'y a pas eu de transformation de ma date en string ou pas intentionnellement.

    j'ai plutôt l'impression que sql Server fait l’âne et change de lui même le format.
    Non.

    SQL Server stocke les dates en mémoire sous forme de FLOAT (format utilisé par microsoft) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cast(getdate() as float) = 41133,6132274306
    La partie entière correspond au nombre de jours depuis le 01/01/1900 à minuit
    La partie décimale correspond à la fraction du jour (ici, on voit que c'est le début d'après-midi puisque > 0.5)

    MySQL, lui, stocke la date sous forme d'un LONG, qui correspond au nombre de secondes depuis le 01/01/1970 à minuit (représentation UNIX)

    Donc à partir de là, vous comprendrez bien qu'une date est une date, et n'a rien à voir avec sa représentation.

    Il faut donc extraire la date d'un SGBD EN IMPOSANT LE FORMAT

    A ce moment, vous saurez décoder le format depuis MySQL au moment où vous allez reconstituer la date.

    Préférez le format ISO YYYY-MM-DD HH:mm:SS qui est le plus facile à lire, et à l'avantage d'être comparable sous forme de chaînes de caractère (donc pour le debug notamment et les traitements en script, c'est plus pratique)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    convert(varchar, madate, 120)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 431
    Points : 129
    Points
    129
    Par défaut
    Merci StringBuilder, pour ces informations

    J'ai donc réussit en transformant ma date "Apr 13 2012 1:55PM" en timestamp et en recréant le format attendu par mysql grâce a la fonction date() de php.

    Bonjour Kropernic,
    Il en me semble pas encore que je soit totalement fou, j'ai trouvé ceci ce qui semble correspondre a mon problème.
    http://php.developpez.com/faq/sgbd/?page=sqlserver

    Mon problème ayant une solution je ne vais pas m'attarder a détailler mes requêtes mais merci pour l'aide.

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Cela reste un artifice de présentation. Une date reste une date. Après si deux systèmes ne sont pas d'accord sur ce qu'est une date, il faut procéder à des conversions pour l'un comprenne ce que l'autre raconte.

  11. #11
    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 : 43
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    [quote)StringBuilder]SQL Server stocke les dates en mémoire sous forme de FLOAT (format utilisé par microsoft) :[/quote]
    En fait, le type datetime est stocké sous la forme de deux entiers de 4 octets chacun :

    - les 4 premiers octets équivalent au nombre de jours depuis le 1er Janvier 1900
    - les 4 octets restants stockent l'heure sous la forme du nombre d'unités (3 millisecondes) depuis la date à minuit.

    @++

  12. #12
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Ah bon ? Je croyais que c'était un double (et non un float) avec la représentation que j'avais donné

    Bon, ben j'aurai appris un truc aujourd'hui

Discussions similaires

  1. problème de conversion de date
    Par thaundeadboss dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/06/2008, 07h07
  2. Problème de conversion de date en C#
    Par Xitog dans le forum Framework .NET
    Réponses: 9
    Dernier message: 10/09/2007, 14h11
  3. Problème de conversion de date
    Par loulou dans le forum Langage
    Réponses: 1
    Dernier message: 29/08/2007, 15h18
  4. [T-SQL] Problème de conversions de dates
    Par kooljy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/06/2006, 14h19
  5. - [CAST ou CONVERT] Problème de conversion de date
    Par Boublou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/07/2004, 14h31

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