Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 23/03/2011, 12h21   #1
FMJ
Membre du Club
 
Inscription : octobre 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 181
Points : 61
Points : 61
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 :
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 :
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 :
Citation:
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 :
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.
FMJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 13h46   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 14h44   #3
FMJ
Membre du Club
 
Inscription : octobre 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 181
Points : 61
Points : 61
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
FMJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 15h04   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
En fait, votre premier code devrait être bon !

Citation:
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 ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 16h30   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
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 684
Points : 10 446
Points : 10 446
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec une double conversion pour faire sauter la précision des millisecondes :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 16h44   #6
FMJ
Membre du Club
 
Inscription : octobre 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 181
Points : 61
Points : 61
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.
FMJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 17h17   #7
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
 
SELECT CONVERT(VARCHAR, GETDATE(), 20)
Citation:

------------------------------
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2011, 20h08   #8
FMJ
Membre du Club
 
Inscription : octobre 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 181
Points : 61
Points : 61
J'ai repris mes tests.

En restant avec Agent SQL configuré avec authentification Windows :

Code :
CONVERT(VARCHAR(20), GETDATE(),20)
Plante --> msg d'erreur :
Citation:
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
FMJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 09h33   #9
FMJ
Membre du Club
 
Inscription : octobre 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 181
Points : 61
Points : 61
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 :
Citation:
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.
FMJ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 18h18   #10
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
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 :
DATEADD(millisecond, -DATEPART(millisecond, GETDATE()), GETDATE())
On manipule les dates avec les fonctions de dates

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 28/03/2011, 19h15   #11
FMJ
Membre du Club
 
Inscription : octobre 2003
Messages : 181
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 181
Points : 61
Points : 61
Je me disais aussi ......

Merci Elsuket pour cette solution bien plus intelligente et élégante que mes tripatouillages !!!!!!
FMJ 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 21h37.


 
 
 
 
Partenaires

Hébergement Web