Попытка исключить «1900-01-01» из столбца конвертированной даты - PullRequest
0 голосов
/ 12 июня 2018

Я понимаю, что есть другие темы, покрывающие это, но я не могу найти ту, которая решает мою проблему.

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

Очевидно, что нулевые значения преобразуются в '1900-01-01', но я не могу найти способ показатьони как пробелы, даже с подзапросом.

Это то, что я делаю ...

Select top 999999999
OtherFields,

case when Engdate = '19000101' then '' else Engdate end as 'EngDate',

OtherOtherFields

from
(

select 
OtherFields,

case 
when VAR_AppID = '3' then nullif( CONVERT(date,concat(right([2201],4), 
SUBSTRING([2201],4,2), left([2201],2))),null)
        else nullif( CONVERT(date,concat(right([3429],4), 
SUBSTRING([3429],4,2), left([3429],2))),null) end as 'Engdate',

case when ([2201] is not null and Len([2201])  = 10 ) then 
CONVERT(date,concat(right([2201],4), SUBSTRING([2201],4,2), left([2201],2)))
else null end as 'EngagementRec',

OtherOtherFields

from

Tables
)

Поля [2201] и [3429] являются текстовыми полями, которые содержатдаты в формате «дд / мм / гггг».

Должен ли я вернуться в текстовый формат, чтобы «» показывал пробел - и если да, будут ли даты по-прежнему распознаваться как даты

Ответы [ 4 ]

0 голосов
/ 14 июня 2018

Я закрываю это сам, так как я не могу найти ничего, что работает.Любая комбинация значений регистра, ISNULL (), NULLIF () и т. Д. Приводит к NULL или «1900-01-01».Преобразование в текст делает поле даты непригодным для использования в Excel.

Поскольку данные будут поступать в сводную таблицу Excel, мне не нужно решать эту проблему, поскольку сводные таблицы в любом случае удаляют нулевые значения.

... Я мог бы вернуться к этому, если мне нужно отобразить данные в списке.

Спасибо всем, кто сделал предложения!

0 голосов
/ 12 июня 2018

Да, сначала преобразуйте их текст, я не думаю, что это плохо.Попробуйте следующее:

Select top 999999999
OtherFields,

case when Engdate = '19000101' then '' else CONVERT(CHAR(10), EngDate, 120) end as 'EngDate' end as 'EngDate',

OtherOtherFields

from
(

select 
OtherFields,

case 
when VAR_AppID = '3' then nullif( CONVERT(date,concat(right([2201],4), 
SUBSTRING([2201],4,2), left([2201],2))),null)
        else nullif( CONVERT(date,concat(right([3429],4), 
SUBSTRING([3429],4,2), left([3429],2))),null) end as 'Engdate',

case when ([2201] is not null and Len([2201])  = 10 ) then 
CONVERT(date,concat(right([2201],4), SUBSTRING([2201],4,2), left([2201],2)))
else null end as 'EngagementRec',

OtherOtherFields

from

Tables
)

Спасибо.

0 голосов
/ 12 июня 2018

Как вы, возможно, знаете, преобразование пустой строки в тип данных даты возвращает 1900-01-01.

Пример SQL:

SELECT CAST ('' as date) AS [thedate]

Возвращает:

thedate
1900-01-01

Значение NULL при приведении к типу данных date все еще равно NULL.Исходя из вашего кода, я думаю, все, что вам нужно сделать, это изменить эту строку:

case when Engdate = '19000101' then '' else Engdate end as 'EngDate',

на:

case when Engdate = '19000101' then NULL else Engdate end as 'EngDate',
0 голосов
/ 12 июня 2018

В соответствии с MS справкой по функции Concat (которая является SQL Server 2012 года, а не 2008) https://docs.microsoft.com/en-us/sql/t-sql/functions/concat-transact-sql?view=sql-server-2017

Если CONCAT получает аргументы со всеми значениями NULL, он возвращает пустую строку типаvarchar (1).

Строка нулевой длины будет неявно преобразована в ноль, что даст вам нулевую дату на сервере sql.Вам нужно обработать нули, прежде чем пытаться преобразовать так, как вы это сделали.Возможно, вместо этого используйте Try_convert.Используйте try_convert с правильным вариантом.TRY_CONVERT (Datetime, columnwithstringdate, 103)

...