Isnull do SQL Server Retornando 1900-01-01 quando o campo é nulo

15

O seguinte trecho de código está retornando 1900-01-01 quando o campo DOB ​​é nulo. Eu queria (e esperava) retornar uma string vazia (''), mas não é. Como devo proceder para obter os resultados desejados?

isnull(convert(date,DOB,1),'')
Juan Velez
fonte
5
Você está misturando demais os tipos de dados. Essencialmente, o que você está fazendo com as NULLdatas está dizendo SELECT CAST('' AS DATE). Que tipo de dados é DOB?
Mark Sinkinson
1
é um tipo de dados varchar que eu estou convertendo a data
Juan Velez
5
Eu sei que este é um post antigo, mas vale a pena mencionar que parece que você está tentando formatar os dados no SQL em vez de permitir que a camada de aplicativos faça isso por você. Em 99,9% das vezes, é melhor deixar a camada do aplicativo fazer a formatação.
Erik

Respostas:

20

Você não pode obter uma sequência vazia porque está retornando o DATEtipo de valor ISNULL.

Por MSDN ,ISNULL

Retorna o mesmo tipo que check_expression. Se um NULL literal for fornecido como verificação_expressão, retornará o tipo de dados do valor_de substituição. Se um NULL literal for fornecido como verificação_expressão e nenhum valor_de substituição for fornecido, retornará um int.

Se você estiver verificando se o valor é ou não NULL, não há necessidade de convertê-lo em uma data, a menos que você deseje retornar um valor de data (o que não parece ser).

Em vez disso, use:

SELECT ISNULL( DOB , '')

Que retornará

''

se o valor for NULL.

Uma NULLdata é NULL(sem valor). Uma string vazia, por outro lado, avalia como 0, que no SQL Server é implicitamente um número inteiro que representa o número de dias desde então 1900-01-01.

LowlyDBA
fonte
-3

Se você deseja retornar um valor para o DOB ​​quando ele é preenchido e remover o valor nulo quando não houver nenhum DOB preenchido. Você pode tentar isso, mas o DOB ​​será um varchar e não um tipo de data.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)
Elvis Candelaria
fonte
2
Transmitir um VARCHARpara um DATEe voltar para um VARCHARnão faz sentido. Quando você remove esse absurdo, sua resposta é a mesma que a resposta aceita, com menos exposição.
Erik
Sim, no seu cenário não faria sentido, mas no cenário em que o usei, comecei com uma datetimedata e precisava apenas dela YYYY-MM-DD. Então, lançando como dateeu largar o tempo. Em seguida, lançar o varcharpermite o uso da isnullfunção. Portanto, ainda recebo uma data para os registros preenchidos e removo os valores nulos. Caso contrário, eu estava recebendo 1900-01-01 00:00:00.000.
Elvis Candelaria
1
Não é o meu cenário, é o cenário da questão. Acredito que é por isso que você está coletando votos negativos. Na verdade, você está tentando responder a uma pergunta diferente.
Erik
Sim você está certo. Eu li isso errado. Minha culpa.
Elvis Candelaria
-3

Isso converterá a data NULL em espaço. A camada de aplicação (Excel) lida com o espaço

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

Basta criar uma visualização

CREATE VIEW test_view
AS
SELECT caso quando ano (DOB) <= 1900 então null mais DOB termina como DOB, algum texto, id do teste;

e use-a em vez da tabela original: selecione * em test_view

user99852
fonte
-5

usar

selecionar isnull (Converter (Varchar (500), Data, 106), '')

está funcionando

ramchandra bobhate
fonte
2
E por que essa é uma boa ideia?
Dez
1
Isso é essencialmente idêntico à resposta do SQLjj .
Andriy M