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 :

Manipulation de format de date


Sujet :

Développement SQL Server

  1. #1
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut Manipulation de format de date
    Bonjour,

    J'ai un petit problème tout bête mais qui commence à m'énerver car je n'en comprend pas tout les tentants et aboutissants.

    Dans une requête de mise à jour d'une procédure stockée, je souhaite affecter à une colonne de type DATETIME la valeur de la date-heure courante, sans la précision milli-secondes (donc qui sont nulles).
    Pour ce faire, j'ai commencé à utiliser le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(VARCHAR, GETDATE(), 20)
    qui passe avec l'analyseur de requête mais qui me provoque une erreur avec le SQL Agent.

    J'ai ensuite essayé naivement celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(CHAR(19), GETDATE())
    qui ne passe ni avec l'Analyseur de requête, ni avec le SQL Agent.

    Dans le procédure stockée, j'ai essayé de jouer avec SET DATEFORMAT, ce qui m'entraîne d'autres erreurs ailleurs dans le code de la PS.

    Les erreurs sont du style :
    Msg 242, Sev 16 : La conversion d'un type de données CHAR en type DATETIME a donné une valeur hors des limites des valeurs de date et d'heure.
    Il est facile d'avoir un format avec juste les minutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(SMALLDATETIME, GETDATE())
    Mais j'ai besoin des secondes et les milli-secondes doivent être obligatoirement nulles.

    J'ai trouvé plein d'infos sur le sujet, mais rien qui n'arrive à éclairer ma lanterne.

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Le type DATETIME stocke les millisecondes, que vous le vouliez ou non

    Il me semble que vous pourriez utiliser DATETIME2(0), pour votre besoin, mais je ne suis pas sur de l'avoir bien compris...

    Pourquoi ne voulez vous pas stocker les millisecondes (faites vous des comparaisons d'heure, et vous ne voulez pas que les millisecondes soient prise en compte dans la comparaison ?)

    Si c'est pour de l'affichage, vous pouvez effectuer votre CONVERT dans votre requete SELECT

  3. #3
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Bonjour,

    Oui le but n'est pas de créer une nouveau type.

    C'est juste que le progiciel qui attaque ces données a été configuré pour ne prendre en compte que les secondes. Les milli-secondes lui posent des problèmes.

    Donc au lieu d'avoir une date du type 2011-03-23 15:21:46.238, il faut que je la transforme en 2011-03-23 15:21:46.000.

    Il me paraissait plus immédiat de procéder avec une conversion basée sur une chaîne de caractères plutôt qu'une manipulation de la date a format numérique.

    De plus le serveur est sous Windows SQL 2000, donc les seuls formats de date sont DATETIME et SMALLDATETIME

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    En fait, votre premier code devrait être bon !

    qui passe avec l'analyseur de requête mais qui me provoque une erreur avec le SQL Agent.
    quelle erreur ?
    dans quel contexte l'utilisez-vous ?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Avec une double conversion pour faire sauter la précision des millisecondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select getdate() as c1,
           convert(datetime, convert(varchar(19), getdate(), 126), 126) as c2
     
    c1                      c2
    ----------------------- -----------------------
    2011-03-23 16:30:17.703 2011-03-23 16:30:17.000

  6. #6
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Pour les erreurs, j'ai donné un exemple ci-dessus qui je pense correspond à la totalité des messages d'erreur (une variante entre CHAR et VARCHAR).

    Quant au contexte du SQL Agent, je viens de regarder :
    Il démarre sur le compte Local System
    Quant à la connexion, il était sur une authentification Windows que je viens de changer en authentification SQL, avec la même connexion que l'Analyseur.

    Je fais des test et un retour ensuite.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    désolé, je me suis mal exprimé, quand je demandais le contexte, c'était surtout pour savoir dans quel ordre SQL le CONVERT etait utilsé
    (dans un SELECT, dans un UPDATE..SELECT, dans une SP avec SET @VAR = CONVERT... ?)

    En fait ce serait bien de donner le script complet, car par exemple, à partir de votre premier code, ceci fonctionne bien :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT CONVERT(VARCHAR, GETDATE(), 20)

    ------------------------------
    2011-03-23 17:14:37

    (1 row(s) affected)
    je pense donc que c'est quand vous essayez d'utiliser cette conversion pour autre chose que cela génére l'erreur (d’ailleurs c'est une erreur de conversion de CHAR vers DATETIME et non l'inverse)... ce serait donc utile d'avoir ce code...

  8. #8
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    J'ai repris mes tests.

    En restant avec Agent SQL configuré avec authentification Windows :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONVERT(VARCHAR(20), GETDATE(),20)
    Plante --> msg d'erreur :
    Msg 242, Sev 16 : La conversion d'un type de données CHAR en type DATETIME a donné une valeur hors des limites des valeurs de date et d'heure. [SQLSTATE 22007]
    En mettant Agent SQL configuré avec authentification SQL --> cela fonctionne correctement.

    C'est donc bien une question de contexte de connexion (donc d'utilisateur), mais je ne comprend pas exactement lequel.

    Tiens, une page spécial conversion format de date :
    http://www.sql-server-helper.com/tips/date-formats.aspx

  9. #9
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Une question :

    Si l'Agent SQL démarre sur le compte LOCAL SYSTEM et que l'Agent SQL soit configurée pour s'authentifier avec le compte Windows, sur quelle connexion se connecte l'Agent SQL ??? ET donc quels droits lui sont associés ???


    [Edit]
    J'ai peut-être un indice.

    Sur ce serveur SQL Server 200, il existe une connexion appelée BUILTIN/Administrateurs qui gère une authentification Windows. Mais sur le domaine BUILTIN .... C'est quoi ce domaine ? Pas le nôtre en tout cas !

    La seule différence entre cette connexion et celle que j'utilise usuellement (authentification SQL), c'est la langue :
    > Authentification Windows --> French
    > Authentification SQL --> English

    Je pense que la différence de traitement des dates vient de là.

    [Edit]
    Oui ça a l'air d'être cela. Voici ce que j'ai trouvé dans l'aide :
    Langues prises en charge par SQL Server
    33 langues naturelles sont définies sur le serveur et installées avec Microsoft® SQL Server™ 2000. Les définitions de chaque langue établissent l'interprétation des données de date :
    > Voici les formats de dates disponibles :
    > dmy (jour, mois, année)
    > mdy (mois, jour, année)
    > ymd (année, mois, jour)
    > Noms de mois longs et courts.
    > Nom de chaque jour.
    > Jour considéré comme le premier jour de la semaine.

  10. #10
    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,

    Ben moi en fait j'aurai fait un CAST en varbinary, que j'aurai casté en uniqueidentifier, pour le caster ensuite en varchar(50), prendre un SUBSTRING ou un RIGHT des millisecondes et le remplacer par '000' ...

    Hé les gars, vous connaissez DATEADD() ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEADD(millisecond, -DATEPART(millisecond, GETDATE()), GETDATE())
    On manipule les dates avec les fonctions de dates

    @++

  11. #11
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Je me disais aussi ......

    Merci Elsuket pour cette solution bien plus intelligente et élégante que mes tripatouillages !!!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Manipulation des formats date
    Par salmabarik dans le forum SAS Base
    Réponses: 1
    Dernier message: 26/07/2013, 09h06
  2. [AC-2003] Manipuler le format date/heure
    Par Fcnaatao dans le forum Access
    Réponses: 7
    Dernier message: 11/05/2012, 15h35
  3. Manipulation de formats de date
    Par muaddibx dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 23/07/2009, 15h54
  4. Manipuler le format retourné pour une date.
    Par BlackMinou dans le forum Oracle
    Réponses: 3
    Dernier message: 05/04/2006, 19h01
  5. Réponses: 3
    Dernier message: 06/05/2002, 19h24

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