SQL Server Isnull Возвращает 1900-01-01, когда поле пусто

15

Следующий фрагмент кода возвращает 1900-01-01, когда поле DOB имеет значение null. Я хотел (и ожидал), что он возвращает пустую строку (''), но это не так. Как мне продолжить, чтобы получить желаемые результаты?

isnull(convert(date,DOB,1),'')
Хуан Велес
источник
5
Вы слишком много смешиваете типы данных. По сути то, что вы делаете с NULLдатами, говорит SELECT CAST('' AS DATE). Какой тип данных DOB?
Марк Синкинсон
1
это тип данных varchar, который я конвертирую в дату
Хуан Велес
5
Я знаю, что это старый пост, но стоит упомянуть, что кажется, что вы пытаетесь отформатировать данные в SQL вместо того, чтобы позволить прикладному уровню сделать это за вас. В 99,9% случаев лучше, если прикладной уровень выполняет форматирование.
Эрик

Ответы:

20

Вы не можете получить пустую строку, потому что вы возвращаете DATEтип значения из ISNULL.

По MSDN ,ISNULL

Возвращает тот же тип, что и check_expression. Если в качестве check_expression предоставлен литерал NULL, возвращает тип данных для параметра replace_value. Если литерал NULL предоставляется как check_expression, и не указано значение replace_value, возвращает int.

Если вы проверяете, является ли значение значением NULL, нет необходимости преобразовывать его в дату, если только вы не хотите вернуть значение даты (которое вам не кажется).

Вместо этого используйте:

SELECT ISNULL( DOB , '')

Который вернется

''

если значение NULL.

NULLДата не является NULL(нет значения). Пустая строка, с другой стороны, оценивается как 0, что в SQL Server неявно является целым числом, представляющим количество дней с тех пор 1900-01-01.

LowlyDBA
источник
-3

Если вы хотите вернуть значение для DOB, когда оно заполнено, и удалить нулевое значение, если DOB не заполнено. Вы можете попробовать это, но DOB будет varchar, а не типом даты.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)
Элвис Канделария
источник
2
Приведение a VARCHARк a DATEи обратно к a VARCHARне имеет никакого смысла. Когда вы убираете эту ерунду, ваш ответ совпадает с принятым ответом с меньшей экспозицией.
Эрик
Да, в вашем сценарии это не имело бы смысла, но в сценарии, для которого я его использовал, я начал с datetimeдаты и мне потребовалась только дата YYYY-MM-DD. Так что, как dateя бросаю время. Затем приведение varcharпозволяет использовать isnullфункцию. Поэтому я все еще получаю дату для заполненных записей и удаляю нулевые значения. В противном случае я получал 1900-01-01 00:00:00.000.
Элвис Канделария
1
Это не мой сценарий, это сценарий вопроса. Я считаю, что именно поэтому вы собираете отрицательные голоса. Вы пытаетесь ответить на другой вопрос.
Эрик
Да ты прав. Я прочитал это неправильно. Моя вина.
Элвис Канделария
-3

Это преобразует значение NULL в пространство. Прикладной уровень (Excel) прекрасно обрабатывает пространство

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT
SQLjj
источник
-3

Просто создайте вид

CREATE VIEW test_view
AS
SELECT - случай, когда год (DOB) <= 1900, тогда нулевой конец DOB заканчивается как DOB, sometext, id из теста;

а затем использовать его вместо исходной таблицы: выберите * из test_view

user99852
источник
-5

использование

выберите isnull (Convert (Varchar (500), Date, 106), '')

работает

Рамчандра Бобхате
источник
2
И почему это хорошая идея?
Дезсо
1
Это по сути идентично ответу SQLjj .
Андрей М