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),'')
Juan Velez
la source
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.

LowlyDBA
la source
-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)
Elvis Candelaria
la source
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
SQLjj
la source
-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

user99852
la source
-5

utilisation

sélectionnez isnull (Convert (Varchar (500), Date, 106), '')

ça marche

ramchandra bobhate
la source
2
Et pourquoi est-ce une bonne idée?
dezso
1
Ceci est essentiellement identique à la réponse de SQLjj .
Andriy M du