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.


-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

-3

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.