web-dev-qa-db-fra.com

Convertir une date au format aaaammjj

Quelle commande SQL est recommandée pour convertir une date au format yyyymmdd?

  1. convert(varchar(8), getdate(), 112); ou
  2. convert(varchar, getdate(), 112)

Je remarque que si j'utilise le second, il ajoutera deux espaces après la date. (par exemple. [20130705] - remarquez les deux espaces après la valeur 20130705)

Est-il recommandé d'utiliser la première instruction SQL?

7
Jack

Par défaut, comme documenté dans MSDN , si aucune longueur n'est spécifiée pour varchar, elle sera par défaut de 30 lors de l'utilisation de CAST ou CONVERT et par défaut de 1 lorsqu'elle sera déclarée comme variable.

Pour démontrer, essayez ceci:

DECLARE @WithLength varchar(3),@WithoutLength varchar;
SET @WithLength = '123';
SET @WithoutLength = '123';

SELECT @WithLength,@WithoutLength

C'est très dangereux, car SQL Server tronque discrètement la valeur, sans même un avertissement et peut conduire à des bogues inattendus.

Cependant, venir au sujet en question, dans le scénario donné, avec ou sans longueur ne fait aucune différence entre les deux déclarations et je ne peux pas voir les 2 espaces de fin dont vous parlez. Essaye ça:

SELECT CONVERT(varchar(8), GETDATE(), 112) 
UNION ALL 
SELECT DATALENGTH(CONVERT(varchar(8), GETDATE(), 112)) 
UNION ALL 
SELECT CONVERT(varchar, GETDATE(), 112)
UNION ALL
SELECT DATALENGTH(CONVERT(varchar, GETDATE(), 112))

Vous remarquerez que la fonction DATALENGTH() renvoie 8 dans les deux cas.

Raj

16
Raj