SQL Server Isnull retournant 1900-01-01 lorsque le champ est nul


15

Le morceau de code suivant renvoie 1900-01-01 lorsque le champ DOB est nul. Je voulais (et j'attendais) qu'il retourne une chaîne vide ('') mais ce n'est pas le cas. Comment dois-je procéder pour obtenir les résultats souhaités?

isnull(convert(date,DOB,1),'')

5
Vous mélangez trop les types de données. Essentiellement, ce que vous faites avec les NULLdates, c'est dire SELECT CAST('' AS DATE). De quel type de données s'agit-il DOB?
Mark Sinkinson

1
c'est un type de données varchar que je convertis à ce jour
Juan Velez

5
Je sais que c'est un ancien article, mais il convient de mentionner qu'il semble que vous essayez de formater les données en SQL au lieu de laisser la couche application le faire pour vous. 99,9% du temps, il vaut mieux laisser la couche application faire le formatage.
Erik

Réponses:


20

Vous ne pouvez pas obtenir une chaîne vide car vous renvoyez le DATEtype de valeur à partir de ISNULL.

Par MSDN ,ISNULL

Renvoie le même type que check_expression. Si un NULL littéral est fourni en tant que check_expression, retourne le type de données de la valeur de remplacement. Si un NULL littéral est fourni en tant que check_expression et qu'aucune valeur de remplacement n'est fournie, retourne un int.

Si vous vérifiez si la valeur est ou non NULL, il n'est pas nécessaire de la convertir en date, à moins que vous ne vouliez renvoyer une valeur de date (ce que vous ne semblez pas).

Utilisez plutôt:

SELECT ISNULL( DOB , '')

Qui reviendra

''

si la valeur est NULL.

Une NULLdate est NULL(sans valeur). Une chaîne vide, en revanche, est évaluée comme 0, qui dans SQL Server est implicitement un entier représentant le nombre de jours écoulés depuis 1900-01-01.


-3

Si vous cherchez à renvoyer une valeur pour DOB lorsqu'elle est remplie et supprimez la valeur nulle lorsqu'il n'y a pas de DOB remplie. Vous pouvez essayer cela, mais le DOB sera un varchar et non un type de date.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)

2
Casting a VARCHARto a DATEet back to a VARCHARn'a aucun sens. Lorsque vous supprimez ce non-sens, votre réponse est la même que la réponse acceptée avec moins d'expositions.
Erik

Oui, dans votre scénario, cela n'aurait pas de sens, mais dans le scénario pour lequel je l'ai utilisé, j'ai commencé avec une datetimeseule date nécessaire YYYY-MM-DD. Donc en coulant comme dateje laisse tomber le temps. Le fait de lancer le varcharpermet d'utiliser la isnullfonction. Je reçois donc toujours une date pour les enregistrements remplis et je supprime les valeurs nulles. Sinon, je devenais 1900-01-01 00:00:00.000.
Elvis Candelaria

1
Ce n'est pas mon scénario, c'est le scénario de la question. Je crois que c'est pourquoi vous recueillez des votes négatifs. Vous essayez en fait de répondre à une autre question.
Erik

Oui, tu as raison. J'ai mal lu. Ma faute.
Elvis Candelaria

-3

Cela convertira la date NULL en espace. La couche d'application (Excel) gère très bien l'espace

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT

-3

Créez simplement une vue

CREATE VIEW test_view
AS
SELECT cas où année (DOB) <= 1900 puis null sinon DOB fin comme DOB, quelque part, id du test;

puis utilisez-le à la place du tableau d'origine: sélectionnez * dans test_view


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.