Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[SQL Server 2005] Format date

10 réponses
Avatar
LN
Bonjour,

je dois stocker une date dans une table sous le format "yyyy-mm-dd".
Ces dates, avant l'insertion dans SQL Server, sont sous ce format. Si je
crée la variable dans une table avec type de données datetime ou
smalldatetime, le format change.
Quelle collation et quel type de données dois-je utiliser pour que ces
données s'insérent avec ce format?

Merci de vos réponses,
LN

10 réponses

Avatar
Rudi Bruchez
LN a écrit:

je dois stocker une date dans une table sous le format "yyyy-mm-dd".
Ces dates, avant l'insertion dans SQL Server, sont sous ce format. Si je
crée la variable dans une table avec type de données datetime ou
smalldatetime, le format change.
Quelle collation et quel type de données dois-je utiliser pour que ces
données s'insérent avec ce format?

Merci de vos réponses,
LN



Bonjour,

Les dates ne sont pas stockées selon un format, elles sont stockées dans
une représentation numérique. Le format d'affichage dépend des paramètres
du serveur, ou du client dans une application qui gère des données de type
Date.

Pour stocker en date une chaîne que vous recevez tel que vous le décrivez,
vous pouvez utiliser l'option de connexion
SET DATEFORMAT ymd

ou un
CONVERT(datetime, votrevaleur, 120)

Pour afficher une date dans un format particulier, en SQL, utilisez la
fonction CONVERT.

Par exemple :
SELECT CONVERT(varchar(10), macolonnedate, 103) FROM ... -- pour un format
français

Je vous laisse regarder dans les Books Online pour les détails. Regarder
aussi http://sqlpro.developpez.com/cours/sqlaz/erreurs/ à la section
"Format de Date"

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/
Avatar
LN
Bonjour,

merci pour votre explications.
Il faut absolument que je stocke les dates sous la forme yyyy-mm-dd. En
effet, je pense le format d'affichage dépend des paramètres du serveur.
C'est pourquoi, j'ai pensé que c'est la collation qu'il faut agir. Mais
laquelle choisir?
Sinon vous me dites d'utiliser utiliser l'option de connexion SET DATEFORMAT
ymd. mais où dois-je indiquer cette information?

Merci de me répondre,
LN



"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news: q7wgm4lv2214.qj1idwk164o6$
LN a écrit:

je dois stocker une date dans une table sous le format "yyyy-mm-dd".
Ces dates, avant l'insertion dans SQL Server, sont sous ce format. Si je
crée la variable dans une table avec type de données datetime ou
smalldatetime, le format change.
Quelle collation et quel type de données dois-je utiliser pour que ces
données s'insérent avec ce format?

Merci de vos réponses,
LN



Bonjour,

Les dates ne sont pas stockées selon un format, elles sont stockées dans
une représentation numérique. Le format d'affichage dépend des paramètres
du serveur, ou du client dans une application qui gère des données de type
Date.

Pour stocker en date une chaîne que vous recevez tel que vous le décrivez,
vous pouvez utiliser l'option de connexion
SET DATEFORMAT ymd

ou un
CONVERT(datetime, votrevaleur, 120)

Pour afficher une date dans un format particulier, en SQL, utilisez la
fonction CONVERT.

Par exemple :
SELECT CONVERT(varchar(10), macolonnedate, 103) FROM ... -- pour un format
français

Je vous laisse regarder dans les Books Online pour les détails. Regarder
aussi http://sqlpro.developpez.com/cours/sqlaz/erreurs/ à la section
"Format de Date"

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/


Avatar
Patrice
Ne pas confondre le format d'affichage et de le format de stockage interne.
Je suggère :
- de passer les dates vers le serveur au format ISO (YYYYMMDD qui est
toujours reconnu quelle que soit la configuration du serveur) (exemple :
INSERT INTO MaTable(d) VALUES ('20060102'))
- ou en passant les dates en tant que paramètre dans une requête (ce qui
évite de convertir soi-même les dates dans un format texte inapproprié)

Dans le sens inverse, le mieux est de lire la date en tant que champ de type
date (donc avec une représentation interne toujours identique) et de la
mettre en forme pour affichage dans l'application cliente (ce qui permet
d'afficher la même date sous des langues ou format différents si besoin
etc...)

--
Patrice

"LN" a écrit dans le message de news:

Bonjour,

merci pour votre explications.
Il faut absolument que je stocke les dates sous la forme yyyy-mm-dd. En
effet, je pense le format d'affichage dépend des paramètres du serveur.
C'est pourquoi, j'ai pensé que c'est la collation qu'il faut agir. Mais
laquelle choisir?
Sinon vous me dites d'utiliser utiliser l'option de connexion SET
DATEFORMAT ymd. mais où dois-je indiquer cette information?

Merci de me répondre,
LN



"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news: q7wgm4lv2214.qj1idwk164o6$
LN a écrit:

je dois stocker une date dans une table sous le format "yyyy-mm-dd".
Ces dates, avant l'insertion dans SQL Server, sont sous ce format. Si je
crée la variable dans une table avec type de données datetime ou
smalldatetime, le format change.
Quelle collation et quel type de données dois-je utiliser pour que ces
données s'insérent avec ce format?

Merci de vos réponses,
LN



Bonjour,

Les dates ne sont pas stockées selon un format, elles sont stockées dans
une représentation numérique. Le format d'affichage dépend des paramètres
du serveur, ou du client dans une application qui gère des données de
type
Date.

Pour stocker en date une chaîne que vous recevez tel que vous le
décrivez,
vous pouvez utiliser l'option de connexion
SET DATEFORMAT ymd

ou un
CONVERT(datetime, votrevaleur, 120)

Pour afficher une date dans un format particulier, en SQL, utilisez la
fonction CONVERT.

Par exemple :
SELECT CONVERT(varchar(10), macolonnedate, 103) FROM ... -- pour un
format
français

Je vous laisse regarder dans les Books Online pour les détails. Regarder
aussi http://sqlpro.developpez.com/cours/sqlaz/erreurs/ à la section
"Format de Date"

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/






Avatar
Rudi Bruchez
LN a écrit:

Il faut absolument que je stocke les dates sous la forme yyyy-mm-dd. En
effet, je pense le format d'affichage dépend des paramètres du serveur.
C'est pourquoi, j'ai pensé que c'est la collation qu'il faut agir. Mais
laquelle choisir?
Sinon vous me dites d'utiliser utiliser l'option de connexion SET DATEFORMAT
ymd. mais où dois-je indiquer cette information?



Bonjour,

La collation n'a pas d'incidence, elle porte sur les chaînes de caractères.
En me répétant : ne confondez pas stockage et affichage de date. Pour
stocker une date que vous envoyez en string, vous devez la convertir. SET
DATEFORMAT vous aide à faire cette conversion, __pour stocker seulement__.
Vous pouvez aussi changer le langage utilisé par la connexion, ou le login
utilisé (avec sp_defaultlanguage).
exemple :

--** code start **
--EXEC sp_helplanguage -- vous donne la liste des langages disponibles avec
leur format de date

SET LANGUAGE french
GO
SELECT @@LANGUAGE
SELECT CAST('15/06/2006' as smalldatetime)
GO
SET LANGUAGE us_english
GO
SELECT @@LANGUAGE
SELECT CAST('15/06/2006' as smalldatetime) -- génère une erreur
GO
--** code end **

Cela déterminera la façon dont les chaînes seront converties en date par
SQL Server, mais cela n'influe en rien l'autre sens, cad le formatage de
dates en affichage.

En SQL 2000 (en tout cas non localisé, je n'ai pas de version SQL Server en
français sous la main), ce formatage est par défaut le format 0, ou via
Query Analyzer/SSMS le format 121 (regardez CONVERT dans l'aide en ligne).
Vous pouvez utiliser CONVERT pour formater votre date en affichage, ou dans
votre langage client, les fonctions de formatage de variables dates. Vous
pouvez aussi modifier, du côté client, les options de votre accès, sur un
DSN, en cochant "use regional settings when outputting date..." (de
mémoire) dans la configuration de votre DSN.

Je ne sais pas s'il y a des modifications dans SQL 2005 à ce sujet.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/
Avatar
LN
Merci de vos réponses.

Donc je vais plutôt jouer sur l'affichage de la variable.
Donc dans ma table, j'ai une variable de type datetime "dd/mm/yyyy
hh:mm:ss.00".
En mettant set dateformat ydm avant le SELECT, la date s'affiche "yyyy-mm-dd
00:00:00.00".
Comment l'afficher sans le TIME càd "yyyy-mm-dd" ?

Merci
LN


"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news:
LN a écrit:

Il faut absolument que je stocke les dates sous la forme yyyy-mm-dd. En
effet, je pense le format d'affichage dépend des paramètres du serveur.
C'est pourquoi, j'ai pensé que c'est la collation qu'il faut agir. Mais
laquelle choisir?
Sinon vous me dites d'utiliser utiliser l'option de connexion SET
DATEFORMAT
ymd. mais où dois-je indiquer cette information?



Bonjour,

La collation n'a pas d'incidence, elle porte sur les chaînes de
caractères.
En me répétant : ne confondez pas stockage et affichage de date. Pour
stocker une date que vous envoyez en string, vous devez la convertir. SET
DATEFORMAT vous aide à faire cette conversion, __pour stocker seulement__.
Vous pouvez aussi changer le langage utilisé par la connexion, ou le login
utilisé (avec sp_defaultlanguage).
exemple :

--** code start **
--EXEC sp_helplanguage -- vous donne la liste des langages disponibles
avec
leur format de date

SET LANGUAGE french
GO
SELECT @@LANGUAGE
SELECT CAST('15/06/2006' as smalldatetime)
GO
SET LANGUAGE us_english
GO
SELECT @@LANGUAGE
SELECT CAST('15/06/2006' as smalldatetime) -- génère une erreur
GO
--** code end **

Cela déterminera la façon dont les chaînes seront converties en date par
SQL Server, mais cela n'influe en rien l'autre sens, cad le formatage de
dates en affichage.

En SQL 2000 (en tout cas non localisé, je n'ai pas de version SQL Server
en
français sous la main), ce formatage est par défaut le format 0, ou via
Query Analyzer/SSMS le format 121 (regardez CONVERT dans l'aide en ligne).
Vous pouvez utiliser CONVERT pour formater votre date en affichage, ou
dans
votre langage client, les fonctions de formatage de variables dates. Vous
pouvez aussi modifier, du côté client, les options de votre accès, sur un
DSN, en cochant "use regional settings when outputting date..." (de
mémoire) dans la configuration de votre DSN.

Je ne sais pas s'il y a des modifications dans SQL 2005 à ce sujet.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/


Avatar
Patrice
Il faudrait alors convertir la date sous forme de texte avant de l'envoyer
vers le client. Je ne suis pas un grand fan de cette méthode.

Ma méthode préférée serait de simplement récupérer la date côté client (ce
qui permet par exemple de faire des calculs, tris etc... comme bon me
semble) et de formater la date sous forme de texte au moment exact ou j'ai
besoin de l'afficher (dans ce cas, voir un groupe dédié à l'outil client
utilisé si le formatage te pose un problème).

SQL sert simplement à récupérer les données dans leur format naturel, le
formatage se fait côté client. Le problème est analogue pour les nombres
décimaux (faut il mieux convertir le . en , sur le serveur en transformant
tout en texte, ou simplement récupérer les valeurs et laisser le formatage
client afficher 2,1 au lieu de 2.1 ?).
--
Patrice

"LN" a écrit dans le message de news:

Merci de vos réponses.

Donc je vais plutôt jouer sur l'affichage de la variable.
Donc dans ma table, j'ai une variable de type datetime "dd/mm/yyyy
hh:mm:ss.00".
En mettant set dateformat ydm avant le SELECT, la date s'affiche
"yyyy-mm-dd 00:00:00.00".
Comment l'afficher sans le TIME càd "yyyy-mm-dd" ?

Merci
LN


"Rudi Bruchez" <"rudi#nospam#[at]babaluga.com"> a écrit dans le message de
news:
LN a écrit:

Il faut absolument que je stocke les dates sous la forme yyyy-mm-dd. En
effet, je pense le format d'affichage dépend des paramètres du serveur.
C'est pourquoi, j'ai pensé que c'est la collation qu'il faut agir. Mais
laquelle choisir?
Sinon vous me dites d'utiliser utiliser l'option de connexion SET
DATEFORMAT
ymd. mais où dois-je indiquer cette information?



Bonjour,

La collation n'a pas d'incidence, elle porte sur les chaînes de
caractères.
En me répétant : ne confondez pas stockage et affichage de date. Pour
stocker une date que vous envoyez en string, vous devez la convertir. SET
DATEFORMAT vous aide à faire cette conversion, __pour stocker
seulement__.
Vous pouvez aussi changer le langage utilisé par la connexion, ou le
login
utilisé (avec sp_defaultlanguage).
exemple :

--** code start **
--EXEC sp_helplanguage -- vous donne la liste des langages disponibles
avec
leur format de date

SET LANGUAGE french
GO
SELECT @@LANGUAGE
SELECT CAST('15/06/2006' as smalldatetime)
GO
SET LANGUAGE us_english
GO
SELECT @@LANGUAGE
SELECT CAST('15/06/2006' as smalldatetime) -- génère une erreur
GO
--** code end **

Cela déterminera la façon dont les chaînes seront converties en date par
SQL Server, mais cela n'influe en rien l'autre sens, cad le formatage de
dates en affichage.

En SQL 2000 (en tout cas non localisé, je n'ai pas de version SQL Server
en
français sous la main), ce formatage est par défaut le format 0, ou via
Query Analyzer/SSMS le format 121 (regardez CONVERT dans l'aide en
ligne).
Vous pouvez utiliser CONVERT pour formater votre date en affichage, ou
dans
votre langage client, les fonctions de formatage de variables dates. Vous
pouvez aussi modifier, du côté client, les options de votre accès, sur un
DSN, en cochant "use regional settings when outputting date..." (de
mémoire) dans la configuration de votre DSN.

Je ne sais pas s'il y a des modifications dans SQL 2005 à ce sujet.

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/






Avatar
Rudi Bruchez
LN a écrit:

Donc je vais plutôt jouer sur l'affichage de la variable.
Donc dans ma table, j'ai une variable de type datetime "dd/mm/yyyy
hh:mm:ss.00".
En mettant set dateformat ydm avant le SELECT, la date s'affiche "yyyy-mm-dd
00:00:00.00".
Comment l'afficher sans le TIME càd "yyyy-mm-dd" ?



Patrice a sans doute raison, j'avoue ne pas avoir d'opinion très arrêtée
sur la question. Trop de formatage dans SQL Server est certainement une
horreur, c'est vrai.

Pour répondre à votre question, pendant un moment Microsoft avait annoncé
qu'il y aurait des types de données seulement date et time dans SQL 2005,
mais apparemment ils ont abandonné l'idée.
Un datetime contient les deux, et toujours les deux. Donc formatez-le dans
vos variables, vos composants d'affichage de données, ... Ou sinon, pour le
faire en SQL, vous devez jouer avec les CONVERT. Par exemple
CONVERT(varchar(10), madate, 103).

--
Rudi Bruchez, MCDBA
http://www.babaluga.com/
Avatar
SQLpro [MVP]
LN a écrit :
Merci de vos réponses.

Donc je vais plutôt jouer sur l'affichage de la variable.



Un SGBDR comme SQL Server ne sait reine afficher. C'est une interface
client qui affiche. Par exemple l'analyseur de requête comme Entreprise
Manager sont deux programme client comme tout ceux que vous pouvez
réaliser avec du code Delphi C#, C++ VB, ASP .net etc...

Les conditions de l'affichage dépendant donc UNIQUEMENT du client.
Une date est stockée dans SQL Server en tant que DATETIME un point c'est
tout !

Donc dans ma table, j'ai une variable de type datetime "dd/mm/yyyy
hh:mm:ss.00".



Il n'y a pas de variables dans les tables, mais des colonnes.

En mettant set dateformat ydm avant le SELECT, la date s'affiche "yyyy-mm-dd
00:00:00.00".



SET DATEFORMAT ... Ne permet que de dire à l'interface cliente, si tu as
une date exprimée sous forme littérale alors elle est codée comme ceci
pour que toi moteur SQL tu puisse la transformer explicitement en
datetime dans ton format interne.
SET DATEFORMAT n'agit onc NULLEMENT sur l'affichage à quelque niveau que
ce soit.

Quelques exmples :

SET DATEFORMAT YMD

SELECT CAST('1999-12-31' AS DATETIME) AS DT

DT
------------------------------------------------------
1999-12-31 00:00:00.000


SET DATEFORMAT YDM

SELECT CAST('1999-12-31' AS DATETIME) AS DT

Serveur : Msg 242, Niveau 16, État 3, Ligne 8
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.

SELECT CURRENT_TIMESTAMP AS DTactuelle

DTactuelle
------------------------------------------------------
2006-05-22 14:52:39.980

(1 ligne(s) affectée(s))


Comme vous le voyez le SET DATEFORMAT n'a eut aucune influence sur la
présentation parce que SQL Server ne s'occupe JAMAIS de cosmétique !

Comment l'afficher sans le TIME càd "yyyy-mm-dd" ?




Il faut la tranformer en chaine de caractères, mais ce ne sera plus une
date. Pour cela utilisez CONVERT avec l'option 121 :


SELECT CONVERT(CHAR(10), maColonneDate, 121) AS DATEONLY

Exemple :

SELECT CONVERT(CHAR(10), CURRENT_TIMESTAMP, 121) AS DATEONLY

DATEONLY
----------
2006-05-22




Merci
LN




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
SQLpro [MVP]
LN a écrit :
> Merci de vos réponses.
>
> Donc je vais plutôt jouer sur l'affichage de la variable.

Un SGBDR comme SQL Server ne sait rien afficher. C'est une interface
client qui affiche. Par exemple l'analyseur de requête comme Entreprise
Manager sont deux programmes clients comme tout ceux que vous pouvez
réaliser avec du code Delphi C#, C++ VB, ASP .net etc...

Les conditions de l'affichage dépendant donc UNIQUEMENT du client.
Une date est stockée dans SQL Server en tant que DATETIME un point c'est
tout !

> Donc dans ma table, j'ai une variable de type datetime "dd/mm/yyyy
hh:mm:ss.00".

Il n'y a pas de variables dans les tables, mais des colonnes.

> En mettant set dateformat ydm avant le SELECT, la date s'affiche
"yyyy-mm-dd 00:00:00.00".

SET DATEFORMAT ... Ne permet que de dire à l'interface cliente, si tu as
une date exprimée sous forme littérale alors elle est codée comme ceci
pour que toi moteur SQL tu puisse la transformer explicitement en
datetime dans ton format interne.
SET DATEFORMAT n'agit onc NULLEMENT sur l'affichage à quelque niveau que
ce soit.

Quelques exmples :

SET DATEFORMAT YMD

SELECT CAST('1999-12-31' AS DATETIME) AS DT

DT
------------------------------------------------------
1999-12-31 00:00:00.000


SET DATEFORMAT YDM

SELECT CAST('1999-12-31' AS DATETIME) AS DT

Serveur : Msg 242, Niveau 16, État 3, Ligne 8
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.

SELECT CURRENT_TIMESTAMP AS DTactuelle

DTactuelle
------------------------------------------------------
2006-05-22 14:52:39.980

(1 ligne(s) affectée(s))


Comme vous le voyez le SET DATEFORMAT n'a eut aucune influence sur la
présentation parce que SQL Server ne s'occupe JAMAIS de cosmétique !

> Comment l'afficher sans le TIME càd "yyyy-mm-dd" ?


Il faut la tranformer en chaine de caractères, mais ce ne sera plus une
date. Pour cela utilisez CONVERT avec l'option 121 :


SELECT CONVERT(CHAR(10), maColonneDate, 121) AS DATEONLY

Exemple :

SELECT CONVERT(CHAR(10), CURRENT_TIMESTAMP, 121) AS DATEONLY

DATEONLY
----------
2006-05-22



>
> Merci
> LN


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
SQLpro [MVP]
LN a écrit :
> Merci de vos réponses.
>
> Donc je vais plutôt jouer sur l'affichage de la variable.

Un SGBDR comme SQL Server ne sait rien afficher. C'est une interface
client qui affiche. Par exemple l'analyseur de requête comme Entreprise
Manager sont deux programmes clients comme tout ceux que vous pouvez
réaliser avec du code Delphi C#, C++ VB, ASP .net etc...

Les conditions de l'affichage dépendant donc UNIQUEMENT du client.
Une date est stockée dans SQL Server en tant que DATETIME un point c'est
tout !

> Donc dans ma table, j'ai une variable de type datetime "dd/mm/yyyy
hh:mm:ss.00".

Il n'y a pas de variables dans les tables, mais des colonnes.

> En mettant set dateformat ydm avant le SELECT, la date s'affiche
"yyyy-mm-dd 00:00:00.00".

SET DATEFORMAT ... Ne permet que de dire à l'interface cliente, si tu as
une date exprimée sous forme littérale alors elle est codée comme ceci
pour que toi moteur SQL tu puisse la transformer explicitement en
datetime dans ton format interne.
SET DATEFORMAT n'agit onc NULLEMENT sur l'affichage à quelque niveau que
ce soit.

Quelques exmples :

SET DATEFORMAT YMD

SELECT CAST('1999-12-31' AS DATETIME) AS DT

DT
------------------------------------------------------
1999-12-31 00:00:00.000


SET DATEFORMAT YDM

SELECT CAST('1999-12-31' AS DATETIME) AS DT

Serveur : Msg 242, Niveau 16, État 3, Ligne 8
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.

SELECT CURRENT_TIMESTAMP AS DTactuelle

DTactuelle
------------------------------------------------------
2006-05-22 14:52:39.980

(1 ligne(s) affectée(s))


Comme vous le voyez le SET DATEFORMAT n'a eut aucune influence sur la
présentation parce que SQL Server ne s'occupe JAMAIS de cosmétique !

> Comment l'afficher sans le TIME càd "yyyy-mm-dd" ?


Il faut la tranformer en chaine de caractères, mais ce ne sera plus une
date. Pour cela utilisez CONVERT avec l'option 121 :


SELECT CONVERT(CHAR(10), maColonneDate, 121) AS DATEONLY

Exemple :

SELECT CONVERT(CHAR(10), CURRENT_TIMESTAMP, 121) AS DATEONLY

DATEONLY
----------
2006-05-22



>
> Merci
> LN


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************