web-dev-qa-db-fra.com

Afficher la chaîne vide lorsque le champ de date est 1/1/1900

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?

11
Melanie

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
24
Aaron Bertrand
select  ISNULL(CONVERT(VARCHAR(23), WorkingDate,121),'') from uv_Employee
5
OOP

Essayez ce code

(case when CONVERT(VARCHAR(10), CreatedDate, 103) = '01/01/1900' then '' else CONVERT(VARCHAR(24), CreatedDate, 121) end) as Date_Resolved
3
muthuraman

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

0
RLilj33

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]
0
Mike

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.

0
programmergirl90