SQL Server Isnull Devuelve 1900-01-01 cuando el campo es nulo

15

El siguiente código devuelve 1900-01-01 cuando el campo DOB ​​es nulo. Quería (y esperaba) que devuelva una cadena vacía ('') pero no lo es. ¿Cómo debo proceder para obtener los resultados deseados?

isnull(convert(date,DOB,1),'')
Juan velez
fuente
55
Estás mezclando demasiado los tipos de datos. Básicamente lo que estás haciendo con las NULLfechas es decir SELECT CAST('' AS DATE). ¿Qué tipo de datos es DOB?
Mark Sinkinson
1
es un tipo de datos varchar que estoy convirtiendo a la fecha
Juan Velez
55
Sé que esta es una publicación antigua, pero vale la pena mencionar que parece que está tratando de formatear los datos en SQL en lugar de dejar que la capa de aplicación lo haga por usted. El 99.9% de las veces es mejor dejar que la capa de aplicación realice el formateo.
Erik

Respuestas:

20

No puede obtener una cadena vacía porque está devolviendo el DATEtipo de valor ISNULL.

Por MSDN ,ISNULL

Devuelve el mismo tipo que check_expression. Si se proporciona un NULL literal como check_expression, devuelve el tipo de datos del valor de reemplazo. Si se proporciona un NULL literal como check_expression y no se proporciona un valor de reemplazo, devuelve un int.

Si está verificando si el valor es o no NULL, no hay necesidad de convertirlo en una fecha, a menos que desee devolver un valor de fecha (que no parece).

En cambio, use:

SELECT ISNULL( DOB , '')

Que volverá

''

si el valor es NULL.

Una NULLfecha es NULL(sin valor). Una cadena vacía, por otro lado, se evalúa como 0, que en SQL Server es implícitamente un número entero que representa el número de días desde entonces 1900-01-01.

LowlyDBA
fuente
-3

Si desea devolver un valor para DOB cuando se rellena y eliminar el valor nulo cuando no se rellena DOB. Puede probar esto, pero el DOB será un tipo varchar y no un tipo de fecha.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)
Elvis Candelaria
fuente
2
Lanzar a VARCHARa ay DATEvolver a a VARCHARno tiene ningún sentido. Cuando eliminas esas tonterías, tu respuesta es la misma que la respuesta aceptada con menos exposición.
Erik
Sí, en su escenario no tendría sentido, pero en el escenario para el que lo usé, comencé con una datetimey solo necesitaba una fecha YYYY-MM-DD. Entonces, lanzando mientras datepierdo el tiempo. Luego, la conversión varcharpermite el uso de la isnullfunción. Entonces todavía obtengo una fecha para los registros poblados y elimino los valores nulos. De lo contrario, me estaba poniendo 1900-01-01 00:00:00.000.
Elvis Candelaria
1
No es mi escenario, es el escenario de la pregunta. Creo que es por eso que está recolectando votos negativos. En efecto, estás tratando de responder una pregunta diferente.
Erik
Sí, tiene usted razón. Lo leí mal. Mi culpa.
Elvis Candelaria
-3

Esto convertirá la fecha NULL en espacio. La capa de aplicación (Excel) maneja bien el espacio

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT
SQLjj
fuente
-3

Solo crea una vista

CREATE VIEW test_view
AS
SELECT caso cuando año (DOB) <= 1900 y luego nulo DOB ​​finaliza como DOB, algún texto, id de la prueba;

y luego usarlo en su lugar tabla original: seleccione * de test_view

usuario99852
fuente
-5

utilizar

seleccione isnull (Convertir (Varchar (500), Fecha, 106), '')

esta funcionando

ramchandra bobhate
fuente
2
¿Y por qué es una buena idea?
dezso
1
Esto es esencialmente idéntico a la respuesta de SQLjj .
Andriy M