J'interroge une base de données comme ceci:
SELECT DISTINCT
CASE WHEN CreatedDate = '1900-01-01 00:00:00.000' THEN '' ELSE CreatedDate END AS CreatedDate
FROM LitHoldDetails
lhd.CreatedDate est un champ DateTime et n'est pas nullable. Je souhaite afficher une chaîne vide si le champ correspond à la date minimale (1/1/1900), mais mon instruction CASE ne fonctionne pas. CreatedDate affiche 1900-01-01 00: 00: 00.000 dans ma requête lorsque cette valeur est dans la base de données. J'utilise SQL Server 2008 R2. Qu'est-ce que je fais mal?
Lorsque vous utilisez une expression CASE
(pas statement ), vous devez être conscient de la priorité des types de données. Dans ce cas, vous ne pouvez pas simplement définir une DATETIME
sur une chaîne vide. Essayez le:
SELECT CONVERT(DATETIME, '');
Une solution consiste à présenter votre date sous forme de chaîne:
CASE WHEN CONVERT(DATE, CreatedDate) = '1900-01-01' -- to account for accidental time
THEN ''
ELSE CONVERT(CHAR(10), CreatedDate, 120)
+ ' ' + CONVERT(CHAR(8), CreatedDate, 108)
END
Ou vous pouvez manipuler les éléments de présentation comme il se doit, au niveau de la présentation.
Voici un exemple qui fonctionne exactement comme vous semblez vouloir:
DECLARE @d TABLE(CreatedDate DATETIME);
INSERT @d SELECT '19000101' UNION ALL SELECT '20130321';
SELECT d = CASE WHEN CreatedDate = '19000101'
THEN ''
ELSE CONVERT(CHAR(10), CreatedDate, 120)
+ ' ' + CONVERT(CHAR(8), CreatedDate, 108)
END FROM @d;
Résultats:
d
-------------------
<-- empty string
2013-03-21 00:00:00
select ISNULL(CONVERT(VARCHAR(23), WorkingDate,121),'') from uv_Employee
Essayez ce code
(case when CONVERT(VARCHAR(10), CreatedDate, 103) = '01/01/1900' then '' else CONVERT(VARCHAR(24), CreatedDate, 121) end) as Date_Resolved
Une autre solution couvrant à la fois les dates minimales (1/1/1900) et maximales (06/06/2079):
ISNULL(NULLIF(NULLIF(CONVERT(VARCHAR(10), CreatedDate, 120), '1900-01-01'), '2079-06-06'), '').
Quelle que soit la solution que vous utilisez, vous devez convertir votre champ date (ou date/heure) en un format spécifique afin de le sécuriser contre différentes configurations de serveur par défaut.
Voir CAST et CONVERT sur MSDN: https://msdn.Microsoft.com/en-us/library/ms187928.aspx
Deux nitpicks. (1) Il est préférable de ne pas utiliser de littéraux de chaîne pour les alias de colonne - ceux-ci sont obsolètes. (2) Utilisez simplement le style 120 pour obtenir la même valeur.
CASE
WHEN CreatedDate = '19000101' THEN ''
WHEN CreatedDate = '18000101' THEN ''
ELSE Convert(varchar(19), CreatedDate, 120)
END AS [Created Date]
Utilisez ceci à l'intérieur de la requête, pas besoin de créer des variables supplémentaires.
CASE WHEN CreatedDate = '19000101' THEN '' WHEN CreatedDate =
'18000101' THEN '' ELSE CONVERT(CHAR(10), CreatedDate, 120) + ' ' +
CONVERT(CHAR(8), CreatedDate, 108) END as 'Created Date'
Fonctionne comme un charme.