SQL Server Isnull Повертається 1900-01-01, коли поле є нульовим


15

Наступний фрагмент коду повертається 1900-01-01, коли поле DOB є нульовим. Я хотів (і очікував), що він поверне порожній рядок (''), але це не так. Як слід діяти, щоб отримати бажані результати?

isnull(convert(date,DOB,1),'')

5
Ви занадто багато змішуєте типи даних По суті, те, що ви робите з NULLпобаченнями SELECT CAST('' AS DATE). Що таке тип даних DOB?
Марк Сінкінсон

1
це тип даних вархара, який я перетворюю на сьогоднішній день
Хуан Велес

5
Я знаю, що це стара публікація, але варто згадати, що вона видається так, ніби ви намагаєтесь відформатувати дані в SQL, а не дозволяти шару програми робити це за вас. 99,9% часу вам краще не дозволяти шару програми робити форматування.
Ерік

Відповіді:


21

Ви не можете отримати порожній рядок, оскільки ви повертаєте DATEтип значення з ISNULL.

На MSDN ,ISNULL

Повертає той самий тип, що і check_expression. Якщо літеральна NULL надається як check_expression, повертає тип даних value_value. Якщо буквальний NULL надається як check_expression і не передбачено value_value, повертає int.

Якщо ви перевіряєте, чи є це значення NULL, немає необхідності перетворювати його на дату, якщо ви не хочете повернути значення дати (яке, здається, не здається).

Замість цього використовуйте:

SELECT ISNULL( DOB , '')

Який повернеться

''

якщо значення NULL.

NULLДата не є NULL(немає значення). З іншого боку, порожня рядок визначає значення 0, яке в SQL Server є неявним цілим числом, що представляє кількість днів з моменту 1900-01-01.


-3

Якщо ви хочете повернути значення DOB, коли воно заповнене, і видаліть нульове значення, коли DOB не заповнене. Ви можете спробувати це, але DOB буде варчаром, а не типом.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)

2
Передача VARCHARна "a" DATEта "назад" до 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 from test;

а потім використовуйте замість оригінальної таблиці: виберіть * з test_view


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.